[英]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.