[英]What does it mean "return a type that is compatible"?
我是 Java 新手,所以我正在阅读 Java Head First。 我已经看到,当您有一个带有抽象方法的抽象类时,您应该在具体类中覆盖这些抽象方法,这意味着“在您的类中创建一个具有相同方法签名(名称和参数)和返回类型的非抽象方法与抽象方法的声明返回类型兼容。”
我可以清楚地理解关于具有相同签名(名称和参数)的第一部分,但我想对与抽象方法的声明返回类型兼容的返回类型有一个明确的解释。
兼容类型究竟是什么意思? 有人可以提供一个例子吗? 返回类型是否应该是抽象方法中定义的返回类型的类或子类?
覆盖方法返回的类型必须相同,或者必须是基方法中返回的类型的子类或子接口。
简而言之:它必须尊重基本方法的约定。 如果基本方法说:“我返回一个水果”,那么覆盖方法可以说“我返回一个水果”,但它也可以说“我返回一个香蕉”。
这很好,因为香蕉是水果。 任何调用该方法并获得香蕉的人都很高兴:预期会得到一个水果,并且收到了一个水果。
不过还车是不正确的,因为当你要水果时,买车是不可接受的。
对此的技术术语是协变返回类型。 请注意,即使基类/方法不是抽象的,此规则也是正确的。
如果您的返回类型是A
,那么您还可以返回从A
派生的任何类B
对象。 所有这些都是兼容的类型。
您的返回类型也可以是接口。 在这种情况下,您可以返回任何实现此接口的对象。
这意味着您的抽象方法的实现必须返回与抽象类示例中定义的对象相同或派生的类:您有一个带有抽象方法的抽象类
abstract class AbstractTest{
abstract Date getInitialTime();
}
然后你有一个测试类。
class Test extends AbstractTest{
...
Date getInitialTime(){
return new Date();
}
}
您覆盖getInitialTime
方法,并且该方法的返回必须是类日期或超类的对象
如果您返回其他内容,那么您就违反了类的方法返回的内容与父类的方法返回的内容之间的约定...
考虑下面的例子。 抽象函数model()
的返回类型是int
。
abstract class Bike{
abstract short model();
}
Bike
的具体类中重新定义此方法时。 具体的类应该有一个方法model()
具有相同的方法签名和兼容的返回类型。一种返回类型与另一种兼容,如果它不会导致精度损失。
一种与
short
兼容的返回类型是int
。
class Honda4 extends Bike{
int 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
。 这可能会导致精度损失。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.