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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Java泛型:返回有界泛型類型

Java泛型:返回有界泛型類型

哈士奇WWW 2021-07-24 19:01:08
我遵循了這段代碼:public <T extends ParentException> T managedException(Exception cause) {            if(ExceptionA.class.isInstance(cause)) {        return ExceptionA.class.cast(cause);    } else if(ExceptionB.class.isInstance(cause)) {        return ExceptionB.class.cast(cause);    } else if(ExceptionC.class.isInstance(cause)){        return ExceptionC.class.cast(cause);    } else {        return new ExceptionD(cause.getMessage(), cause);    }}在這里ExceptionA,ExceptionB,ExceptionC,ExceptionD是兒童ParentException。在編譯時(shí),我得到了錯(cuò)誤:incompatible types: ExceptionA cannot be converted to Tincompatible types: ExceptionB cannot be converted to Tincompatible types: ExceptionC cannot be converted to Tincompatible types: ExceptionD cannot be converted to T但是,如果我將代碼更改為:@SuppressWarnings("unchecked")public <T extends ParentException> T managedException(Exception cause) {            if(ExceptionA.class.isInstance(cause)) {        return (T) ExceptionA.class.cast(cause);    } else if(ExceptionB.class.isInstance(cause)) {        return (T) ExceptionB.class.cast(cause);    } else if(ExceptionC.class.isInstance(cause)){        return (T) ExceptionC.class.cast(cause);    } else {        return (T) new ExceptionD(cause.getMessage(), cause);    }}它沒(méi)有編譯錯(cuò)誤。正如 SO 線程的這個(gè)答案中提到的:How do I make the method return type generic? ,T允許使用 with進(jìn)行轉(zhuǎn)換,并且在此線程中給出了另一個(gè)指針:Java 泛型:泛型類型僅定義為返回類型。但我的問(wèn)題是:當(dāng)T有界并且所有返回的對(duì)象都落入指定的界限時(shí),為什么我需要使用類型轉(zhuǎn)換?
查看完整描述

3 回答

?
慕哥9229398

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊

你在做什么是錯(cuò)誤的。這就是您收到錯(cuò)誤的原因。你可以調(diào)用你的方法,ExceptionC exceptionC=managedException(ExceptionD d)你最終會(huì)得到一個(gè)(ExceptionC) exceptionD;強(qiáng)制轉(zhuǎn)換并且強(qiáng)制轉(zhuǎn)換它會(huì)掩蓋錯(cuò)誤,但你會(huì)在運(yùn)行時(shí)得到它。


將您的方法更改為:


public ParentException managedException(Exception cause) {        

    if(ExceptionA.class.isInstance(cause)) {

        return ExceptionA.class.cast(cause);

    } else if(ExceptionB.class.isInstance(cause)) {

        return ExceptionB.class.cast(cause);

    } else if(ExceptionC.class.isInstance(cause)){

        return ExceptionC.class.cast(cause);

    } else {

        return new ExceptionD(cause.getMessage(), cause);

    }

}

這里不需要泛型。所有這些異常也是 ParentExceptions,所以你可以直接返回它們。當(dāng)您考慮它時(shí),您正在嘗試使該方法返回不同的類型。不能那樣做,因?yàn)槿绻阌幸粋€(gè)從這個(gè)方法初始化的變量,你需要知道結(jié)果是什么。而且您知道結(jié)果將是 ParentException 但您不知道那是哪種父異常。


其背后的原因是,您的方法如果編寫為不返回 ParentException - 它返回 T (子類)。您可以返回不同類型的子類,而不是您想要獲取的子類。


在一個(gè)更簡(jiǎn)單的例子中,如果我們有:


class A {}


class B extends A{  };


class C extends A{  };


public  <T extends A> T test() {        

        return (T) new B();

}   

我們可以調(diào)用它C c=test();我們實(shí)際上嘗試強(qiáng)制轉(zhuǎn)換(C) new B();這是不兼容的但是我們已經(jīng)屏蔽了它并且我們?cè)谶\(yùn)行時(shí)得到了異常


查看完整回答
反對(duì) 回復(fù) 2021-07-29
?
浮云間

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超4個(gè)贊

因?yàn)?/p>

ExceptionA a = managedException(new ExceptionB());

將與ClassCastException. Java 推斷T為,ExceptionA并且您的代碼將進(jìn)入這種B情況,這將導(dǎo)致錯(cuò)誤的強(qiáng)制轉(zhuǎn)換。

Java 說(shuō)它ExceptionC不是 a是正確的,T因?yàn)樗?code>T也可以是任何其他子類型ParentException。


查看完整回答
反對(duì) 回復(fù) 2021-07-29
  • 3 回答
  • 0 關(guān)注
  • 155 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

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