3 回答

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個贊
讓我們用一個簡單的例子來解釋為什么改變重寫方法的返回類型沒有任何意義。
假設(shè)我有一個Car對象:
class Car {
public String getModel() {
return "Awesome Car";
}
}
此類Car有一個方法getModel()返回一個String.
現(xiàn)在,您有另一個擴(kuò)展Car并覆蓋該getModel()方法的類:
class DumbCar extends Car {
@Override
public Hamburger getModel() {
return new Hamburger();
}
}
突然間,你遇到了一個大問題。您創(chuàng)建了一個DumbCar對象,因?yàn)槟浪蠧ar對象都可以告訴您它們的模型,所以您嘗試獲取該模型:
DumbCar myCar = new DumbCar();
System.out.println(myCar.getModel());
輸出是A juicy Big Mac!
這對你有意義嗎?你不能駕駛巨無霸。
Java 是一種高度類型安全的語言。當(dāng)你寫一個要求的聲明時getModel(),你需要絕對地,100% 肯定,你得到的數(shù)據(jù)是你所期望的。Java 強(qiáng)制執(zhí)行該期望。

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個贊
問題基本上是這樣的事情會使 Java 類型系統(tǒng)不健全,并且由于 Java 有一個靜態(tài)類型系統(tǒng),這是不允許的。
假設(shè)你有一個Expression接口:
interface Expression {
Integer evaluate();
}
現(xiàn)在你有了一個Addition實(shí)現(xiàn):
class Addition implements Expression {
private Expression left;
private Expression right;
Addition(Expression left, Expression right) {
this.left = left;
this.right = right;
}
@Override
public Integer evaluate() {
return left.evaluate() + right.evaluate();
}
}
只要表達(dá)式計算為整數(shù),這就有效,例如
class Constant implements Expression {
private Integer value;
Constant(Integer value) {
this.value = value;
}
@Override
public Integer evaluate() {
return this.value;
}
}
這允許我們做這樣的事情:
Expression left = new Constant(1);
Expression right = new Constant(2);
Expression addition = new Addition(left, right);
Integer result = addition.evaluate();
如果你有一個表達(dá)式,而不是評估Integer為其他不是表達(dá)式的東西,比如 aCat或 a ,現(xiàn)在會發(fā)生什么Dog?
它會立即破壞您過去編寫的所有其他表達(dá)式的可靠性,例如上一個示例的表達(dá)式,或者我們在假設(shè)Addition.evaluate和表達(dá)式返回 not 或 的方法left中right所做Integer的Cats明顯假設(shè)Dogs。

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個贊
Java 是一種靜態(tài)類型語言。
這意味著編譯器會在程序運(yùn)行之前檢查所有類型是否有意義。因此,您不會在運(yùn)行時出現(xiàn)錯誤,因?yàn)槟承┓椒ɑ蜃侄尾弧按嬖凇薄?/p>
為了使它工作,如果你有這樣的代碼
MyBean x = something.getMyBean();
不允許編譯器確定類型的子類something
將返回類型更改getMyBean()
為除此之外的其他MyBean
類型(也允許子類MyBean
,這稱為縮小返回類型——但即使那樣也是不可能的Java 5 之前)。
添加回答
舉報