在java中覆盖具有不同返回类型的方法?

时间:2013-01-25 10:24:15

标签: java overloading override

我读过一本书,它说我可以覆盖一个方法,如果它有相同的签名。根据书中方法的签名是Method_Name +传递的参数。

根据本书,我可以覆盖具有不同返回类型的方法。实际上是否可以在Java中覆盖具有不同返回类型的方法?因为我在网上做了一些搜索,我发现有人说要覆盖一个方法,返回类型也应该是相同的。

根据书中它还说当我们尝试使用相同的方法名称和参数但不同的返回类型重载方法时,java将抛出编译错误,因为签名仅表示方法名称和参数。如果这是真的,我们应该能够覆盖具有不同返回类型的方法。

请帮我理解这一点。提前谢谢。

7 个答案:

答案 0 :(得分:25)

只要它与重写方法的返回类型兼容,您就可以返回其他类型。兼容意味着:它是被重写方法返回的类或接口的子类,子接口或实现。

这是合乎逻辑的。如果一个方法返回一个Animal,并且派生类返回一个Cow,那么你就不会破坏超类方法的契约,因为Cow是一个Animal。如果派生类返回香蕉,那就不再正确,因为香蕉不是动物。

答案 1 :(得分:11)

你的父母班向外界承诺。例如,方法:

public Price calculatePrice(Items[] items)

它告诉世界期待价格。

如果您在子类中增强了该功能,您仍然必须保留父类的原始承诺。

您可以添加重载的计算方式:

public Price calculatePrice(Items[] items, Integer minimumCharge)

您甚至可以使用更具体的返回类型来改善父母的承诺:

public AccuratePrice calculatePrice(Items[] items, Integer minimumCharge)

但你必须至少返回你父母所承诺的类型。 方法声明中的异常也是如此。

答案 2 :(得分:3)

是的,从Java 5开始,它可以称为协变返回类型。返回类型应该是超类方法返回类型的子级(不允许使用基本类型)。示例

class X implements Cloneable {

    @Override
    protected X clone() {
        try {
            return (X) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new Error(e); // can never happen
        }
    }
}

答案 3 :(得分:1)

  

您的overriden方法可以具有相同的类型或子类型   原始的返回类型,称为协变返回。

如果将overriden方法的返回类型更改为不是原始类型的子类型的其他类型,则会出现编译时错误。

答案 4 :(得分:1)

以下是一个例子:

class Base {
    public Number test() {
        return 0;
    }
}

class A extends Base {
    public Long test() {
        return 1L;
    }
}

答案 5 :(得分:0)

Yes we can override different return types but they should be subclass.

public class Shape {
    public Shape area(Integer i) {
        System.out.println("Sape Area");
        System.out.println("Integer");
        return null;
    }
}


package com.oops;

public class Circle extends Shape {
    public Circle area(Integer i) {
        System.out.println("Circle Area");
        System.out.println("int");
        return null;
    }
}

答案 6 :(得分:0)

// Covariant Overriding 
public class Parent {

  public Parent(){}
  String parentName;
  public Parent(String parentName){
    this.parentName=parentName;
    System.out.println(this.parentName);
 }

public  Parent show(){
    return new Parent("Parent");
}
}




public class Child extends Parent{

  public Child(){}
  String name;
  public Child(String name){
    this.name=name;
    System.out.println(this.name);
  }
  public Child show(){
    return new Child("Child");
}
}



public class Main {

public static void main(String[] args) {
    Parent parent=new Child();
    parent.show();

    Parent parent1=new Parent();
    parent1.show();
}
}