私は本当に理解できないものを構築しました - それがどのように機能するのかわかりません。このマルチキャッチの説明記事に慣れてきました。
次の 2 つの例外とコードを検討してください。
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
to をキャストすることになっているため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
ますか? この質問はそれについて尋ねており、おそらくそれが答えです。もしそうなら、e にアクセスしたときに CustomValueGetter インターフェイスが「見える」のはなぜですか? 私の場合e
、Exception
.そうでない場合、実際のクラスがどちらかである場合、
MyException1
またはMyException2
これらのクラスの両方で利用可能な同じメソッドを単に呼び出すことができないのはなぜですか?e
両方の例外のすべての共通インターフェースを実装し、最も近い共通スーパークラス型である、動的に生成されたクラスのインスタンスですか?