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