3 回答

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í)得到了異常

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
。
添加回答
舉報(bào)