什么意思“返回一个兼容的类型”?

时间:2016-03-06 14:57:40

标签: java override abstract-class

我刚接触Java,所以我正在阅读Java Head First。我已经看到,当你有一个抽象类的抽象类时,你应该在一个具体的类中覆盖这些抽象方法,这意味着“使用相同的方法签名(名称和参数)在类中创建一个非抽象方法返回类型,与抽象方法的声明返回类型兼容。“

我可以清楚地理解关于具有相同签名(名称和参数)的第一部分,但我希望有一个关于 的返回类型的明确解释,该返回类型与声明的返回类型兼容抽象方法。

什么是兼容类型?有人可以提供一个例子吗?返回类型应该是抽象方法中定义的返回类型的类还是子类?

4 个答案:

答案 0 :(得分:3)

重写方法返回的类型必须相同,或者必须是基本方法中返回的类型的子类或子接口。

简而言之:它必须尊重基本方法的合同。如果基本方法说:“我返回一个水果”,那么最重要的方法可以说“我返回一个水果”,但它也可以说“我返回一个香蕉”。

这很好,因为香蕉是一种水果。任何打电话给这种方法并获得香蕉的人都很高兴:预计会有水果,收到水果。

回车不正确,因为当你要求水果时,不能接受汽车。

技术术语是covariant return type。请注意,即使基类/方法不是抽象的,此规则也是如此。

答案 1 :(得分:3)

如果您的返回类型为A,那么您还可以返回从B派生的任何类A的对象。所有这些都是兼容的类型。

您的返回类型也可以是一个界面。在这种情况下,您可以返回实现此接口的任何对象

答案 2 :(得分:1)

这意味着您的抽象方法实现必须返回Abstract类中定义的对象的相同或派生类 例: 你有一个抽象方法的抽象方法

abstract class AbstractTest{
    abstract Date getInitialTime();
}

然后你有一个测试类。

class Test extends AbstractTest{

...
    Date getInitialTime(){
        return new Date();
    }
}

重写getInitialTime方法,该方法的返回必须是类日期或其超类的对象

如果你返回别的东西,那么你正在打破你的类返回的方法和父类返回的方法之间的契约......

答案 3 :(得分:1)

考虑以下示例。抽象函数model()的返回类型是int

abstract class Bike{  
  abstract int model();  
}  
  • 在扩展抽象类Bike的具体类中重新定义此方法时。具体类应该具有方法model(),方法签名和兼容的返回类型。
  

一种返回类型与另一种类型兼容,如果它不会导致丢失   精确度。

     

int兼容的一种返回类型是long

class Honda4 extends Bike{  
    long model() 
    //long is compatible with int since there is no loss of precision
    {
         return 1234;
    }  

    public static void main(String args[]){  
        Bike obj = new Honda4();  
        System.out.println(obj.model());  
    }  

}  

您能否指定与int不兼容的退货类型?

  • short。这可能会导致精度下降。