亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我不能更改覆蓋方法的返回類型(協變返回類型除外)?

為什么我不能更改覆蓋方法的返回類型(協變返回類型除外)?

呼喚遠方 2023-02-23 16:38:55
請注意 - 我在問為什么?如果您能給出一個更改返回類型實際上會破壞代碼的示例,那將非常有用為什么我不能更改重寫方法的返回類型(協變返回類型除外)。class Parent{   public void sayhello(){ ... };}class Child extends Parent{    public String sayhello() { . . .}}現在,如果我運行以下代碼:class test{    public static void main(String[] args){       Parent p = new Child();       p.sayHello();         }    }凸輪某人請確認是否正在發生以下步驟:編譯器找出父對象“p”的類型。編譯器檢查父類中是否存在方法“sayHello()”。在 Runtime 期間,JVM 發現它是一個 Child 對象并調用該方法的子版本。子方法被調用。謝謝。
查看完整描述

3 回答

?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

讓我們用一個簡單的例子來解釋為什么改變重寫方法的返回類型沒有任何意義。


假設我有一個Car對象:


class Car {


    public String getModel() {

        return "Awesome Car";

    }

}

此類Car有一個方法getModel()返回一個String.


現在,您有另一個擴展Car并覆蓋該getModel()方法的類:


class DumbCar extends Car {

    @Override

    public Hamburger getModel() {

        return new Hamburger();

    }

}

突然間,你遇到了一個大問題。您創建了一個DumbCar對象,因為您知道所有Car對象都可以告訴您它們的模型,所以您嘗試獲取該模型:


DumbCar myCar = new DumbCar();

System.out.println(myCar.getModel());

輸出是A juicy Big Mac!


這對你有意義嗎?你不能駕駛巨無霸。


Java 是一種高度類型安全的語言。當你寫一個要求的聲明時getModel(),你需要絕對地,100% 肯定,你得到的數據是你所期望的。Java 強制執行該期望。


查看完整回答
反對 回復 2023-02-23
?
幕布斯6054654

TA貢獻1876條經驗 獲得超7個贊

問題基本上是這樣的事情會使 Java 類型系統不健全,并且由于 Java 有一個靜態類型系統,這是不允許的。


假設你有一個Expression接口:


interface Expression {

    Integer evaluate();

}

現在你有了一個Addition實現:


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();

   }

}

只要表達式計算為整數,這就有效,例如


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 ,現在會發生什么Dog?


它會立即破壞您過去編寫的所有其他表達式的可靠性,例如上一個示例的表達式,或者我們在假設Addition.evaluate和表達式返回 not 或 的方法left中right所做Integer的Cats明顯假設Dogs。


查看完整回答
反對 回復 2023-02-23
?
慕桂英4014372

TA貢獻1871條經驗 獲得超13個贊

Java 是一種靜態類型語言。

這意味著編譯器會在程序運行之前檢查所有類型是否有意義。因此,您不會在運行時出現錯誤,因為某些方法或字段不“存在”。

為了使它工作,如果你有這樣的代碼

MyBean x = something.getMyBean();

不允許編譯器確定類型的子類something將返回類型更改getMyBean()為除此之外的其他MyBean類型(也允許子類MyBean,這稱為縮小返回類型——但即使那樣也是不可能的Java 5 之前)。


查看完整回答
反對 回復 2023-02-23
  • 3 回答
  • 0 關注
  • 144 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號