我刚接触Java,所以我正在阅读Java Head First。我已经看到,当你有一个抽象类的抽象类时,你应该在一个具体的类中覆盖这些抽象方法,这意味着“使用相同的方法签名(名称和参数)在类中创建一个非抽象方法返回类型,与抽象方法的声明返回类型兼容。“
我可以清楚地理解关于具有相同签名(名称和参数)的第一部分,但我希望有一个关于 的返回类型的明确解释,该返回类型与声明的返回类型兼容抽象方法。
什么是兼容类型?有人可以提供一个例子吗?返回类型应该是抽象方法中定义的返回类型的类还是子类?
答案 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
。这可能会导致精度下降。