3 回答

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

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

TA貢獻1871條經(jīng)驗 獲得超13個贊
Java 是一種靜態(tài)類型語言。
這意味著編譯器會在程序運行之前檢查所有類型是否有意義。因此,您不會在運行時出現(xiàn)錯誤,因為某些方法或字段不“存在”。
為了使它工作,如果你有這樣的代碼
MyBean x = something.getMyBean();
不允許編譯器確定類型的子類something
將返回類型更改getMyBean()
為除此之外的其他MyBean
類型(也允許子類MyBean
,這稱為縮小返回類型——但即使那樣也是不可能的Java 5 之前)。
添加回答
舉報