Я построил то, что я действительно не понимаю - я не знаю, как это работает. Я познакомился с этой статьей описания многоядерности.
Рассмотрим эти два исключения и код:
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
? Этот вопрос спрашивает об этом, и это, мол, ответ. Если да, то почему интерфейс CustomValueGetter "видимый", когда я обращаюсь к e? Это не должно быть, если в моем случаеe
являетсяException
. -
И если нет, если реальный класс является либо
MyException1
, либоMyException2
, почему я не просто могу назвать тот же метод доступным для обоих этих классов? -
Является ли
e
экземпляром динамически сгенерированного класса, который реализует все общие интерфейсы обоих исключений и является ближайшим общим типом supperclass?