第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

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

3 回答

?
慕無忌1623718

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í)行該期望。


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

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。


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

TA貢獻1871條經(jīng)驗 獲得超13個贊

Java 是一種靜態(tài)類型語言。

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

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

MyBean x = something.getMyBean();

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


查看完整回答
反對 回復 2023-02-23
  • 3 回答
  • 0 關(guān)注
  • 138 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號