20

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

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

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

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

4

7 回答 7

27

您可以返回不同的类型,只要它与被覆盖方法的返回类型兼容。兼容意味着:它是被覆盖方法返回的类或接口的子类、子接口或实现。

这是合乎逻辑的。如果一个方法返回一个 Animal,而您的派生类返回一个 Cow,那么您并没有违反超类方法的约定,因为 Cow 是一个 Animal。如果派生类返回一个香蕉,那就不正确了,因为香蕉不是动物。

于 2013-01-25T10:28:56.500 回答
12

你的父类已经向外界做出了承诺。例如,方法:

public Price calculatePrice(Items[] items).

它告诉世界期待价格。

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

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

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

你甚至可以通过使用更具体的返回类型来改进你父母的承诺:

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

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

于 2013-01-25T10:37:44.097 回答
4

是的,从 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
        }
    }
}
于 2013-01-25T10:31:38.407 回答
1

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

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

于 2013-01-25T10:26:44.167 回答
1

这是一个例子:

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

class A extends Base {
    public Long test() {
        return 1L;
    }
}
于 2013-01-25T10:29:48.847 回答
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;
    }
}
于 2013-08-17T20:42:07.383 回答
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();
}
}
于 2016-04-23T10:27:50.597 回答