3 回答

TA貢獻1877條經驗 獲得超6個贊
你在做什么是錯誤的。這就是您收到錯誤的原因。你可以調用你的方法,ExceptionC exceptionC=managedException(ExceptionD d)你最終會得到一個(ExceptionC) exceptionD;強制轉換并且強制轉換它會掩蓋錯誤,但你會在運行時得到它。
將您的方法更改為:
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,所以你可以直接返回它們。當您考慮它時,您正在嘗試使該方法返回不同的類型。不能那樣做,因為如果你有一個從這個方法初始化的變量,你需要知道結果是什么。而且您知道結果將是 ParentException 但您不知道那是哪種父異常。
其背后的原因是,您的方法如果編寫為不返回 ParentException - 它返回 T (子類)。您可以返回不同類型的子類,而不是您想要獲取的子類。
在一個更簡單的例子中,如果我們有:
class A {}
class B extends A{ };
class C extends A{ };
public <T extends A> T test() {
return (T) new B();
}
我們可以調用它C c=test();我們實際上嘗試強制轉換(C) new B();這是不兼容的但是我們已經屏蔽了它并且我們在運行時得到了異常

TA貢獻1829條經驗 獲得超4個贊
因為
ExceptionA a = managedException(new ExceptionB());
將與ClassCastException
. Java 推斷T
為,ExceptionA
并且您的代碼將進入這種B
情況,這將導致錯誤的強制轉換。
Java 說它ExceptionC
不是 a是正確的,T
因為它T
也可以是任何其他子類型ParentException
。
添加回答
舉報