我构建了一些我不太了解的东西——我不知道它是如何工作的。我已经熟悉了这篇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
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
一个动态生成的类的实例,它实现了两个异常的所有公共接口并且是最接近的公共超类类型?