我構建了一些我不太瞭解的東西 - 我不知道它是如何工作的。我已經熟悉了這個multicatch explaination article。確定編譯時multicatch異常類型
考慮這兩種例外和代碼:
public class MyException1 extends Exception {
// constructors, etc
String getCustomValue();
}
public class MyException2 extends Exception {
// constructors, etc
String getCustomValue() { return "foo"; }
}
try {
//...
} catch (MyException1|MyException2 e) {
e.getCustomValue(); // won't work, as I expected
}
我就不能叫getCustomValue()
,儘管方法是相同的,因爲Java裏面上述try/catch
被認爲實際上是鑄造MyException1/2
到Exception
(這就是我理解文檔的方式)。
但是,如果我介紹了一個這樣的接口:
public interface CustomValueGetter {
String getCustomValue();
}
public class MyException1 extends Exception implements CustomValueGetter /*...*/
public class MyException2 extends Exception implements CustomValueGetter /*...*/
,並把它添加到兩個例外,Java的其實是能夠允許我使用這個方法。然後調用,這是有效的:
try {
//...
} catch (MyException1|MyException2 e) {
e.getCustomValue(); // does work
}
總之,我的問題是:什麼是真正發生在這裏:(MyException1|MyException2 e)
。
什麼是e
?
選擇作爲
e
類型最接近的超? This question asks about it這就是所謂的答案。如果是這樣,那麼爲什麼當我訪問e時接口CustomValueGetter「可見」?在我的情況下,它不應該是e
是Exception
。如果不是,如果真實的類是
MyException1
或MyException2
爲什麼我不能簡單地調用相同的方法可用於這兩個類?是
e
動態生成的類的一個實例,它實現了這兩個異常的所有常見接口,並且是最接近的普通超類類型?
如果在答案中發佈的鏈接的接受答案是正確的,那麼我使用的接口永遠不應該在'e'中解析,因爲這兩個例外的超類都不會實現它。 – Dariusz
@Dariusz我edid並引用了另一個問題的答案中的鏈接,通知後面的部分說:'一個Iub可以是一個超類和一個或多個接口的交集類型。' – SomeJavaGuy
太糟糕了,措辭沒有使它轉化爲實際的Java語言文檔(這是非常模糊寫的)。我猜最接近的是[交集類型](https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.9)的描述,其中提到「類型推斷( §15.12.2.7)「,對[catch子句]的描述也是如此(https://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20-510 )。 – Andreas