确定编译时多线程异常类型
我构建了一些我并不真正理解的东西 - 我不知道它是如何工作的。我已经熟悉了这篇多通道解释文章。
请考虑以下两个异常和代码:
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
}
即使方法是相同的,我也无法调用,因为在Java中,上面的内容实际上应该将转换为(这就是我理解文档的方式)。getCustomValue()
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
一个动态生成的类的实例,它实现了两个异常的所有公共接口,并且是最接近的公共supperclass类型?
e