class Bouncy<T> extends Throwable {
}
// Error: the generic class Bouncy<T> may not subclass java.lang.Throwable
Run Code Online (Sandbox Code Playgroud)
为什么Java不支持泛型Throwable?
我意识到类型擦除使某些事情变得复杂,但显然Java已经经历了很多,所以为什么不再推动它,并允许泛型Throwables,通过全面的编译时检查潜在的问题?
我觉得类型擦除论证相当薄弱.目前,我们做不到:
void process(List<String> list) {
}
void process(List<Integer> list) {
}
Run Code Online (Sandbox Code Playgroud)
当然,我们没有它.我不要求,我们应该能够做到catch Bouncy<T1>,并Bouncy<T2>在同一个try块,但是如果我们使用他们在严格的编译时可执行的规则不相交的上下文(这是相当多的仿制药的工作方式现在),你说对不对可行吗?
阅读JavaDoc Optional,我遇到了一个奇怪的方法签名; 我一生中从未见过:
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
throws X extends Throwable
Run Code Online (Sandbox Code Playgroud)
乍一看,我想知道通用异常<X extends Throwable>是如何可能的,因为你不能这样做(这里和这里).第二个想法,这开始有意义,因为它只是绑定Supplier...但供应商本身确切知道它应该是什么类型,在泛型之前.
但第二行击中了我:
throws X 是一个完整的通用异常类型.然后:
X extends Throwable,这是什么意思?
X 已经绑定在方法签名中.throws Throwable,其余的将被类型擦除删除?一,不是直接相关的问题:
catch(Throwable t),或者被提供Supplier的类型; 因为它无法在运行时检查?编译时错误:泛型类可能不是java.lang.Throwable的子类
public class TestGenericClass<E> extends Exception {
/*Above line will give compile error, the generic class TestGenericClass<E> may
not subclass java.lang.Throwable*/
public TestGenericClass(String msg) {
super(msg);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的编译时错误是出于以下§jls-8.1.2中给出的原因,并在此问题中进行了解释:
如果泛型类是Throwable(第11.1.1节)的直接或间接子类,则是编译时错误.
由于Java虚拟机的catch机制仅适用于非泛型类,因此需要此限制.
题:
如何限制子类java.lang.Throwable不是泛型类?
或者更通用的问题是,如何限制任何类的子类不能通用?
我试图在泛型类中进行常规的RuntimeException,如下所示:
public class SomeGenericClass<SomeType> {
public class SomeInternalException extends RuntimeException {
[...]
}
[...]
}
Run Code Online (Sandbox Code Playgroud)
这段代码给我一个错误的单词RuntimeException说The generic class SomeGenericClass<SomeType>.SomeInternalException may not subclass java.lang.Throwable.
这个RuntimeException与我的类是通用的有什么关系?
我已将 java 类中的异常包装到自定义异常中。我希望我的自定义异常接收两个参数,一个是消息,另一个是列表。
但问题是 listOfFailedRecords 必须是通用的。
就像是,
throw new MyException("Failed due to dependency", listOfFailedRecords)
Run Code Online (Sandbox Code Playgroud)
MyException 类看起来像,
public class MyException<T> extends Exception {
List<T> listOfFailedRecords;
MyException(String message, List<T> listOfFailedRecords) {
super(message);
this.listOfFailedRecords = listOfFailedRecords;
}
}
Run Code Online (Sandbox Code Playgroud)
但问题是 Java 不允许泛型类扩展 Exception 类。
现在应该采取什么方法?我应该将对象列表传递给这个异常吗
List<Object> listOfFailedRecords
Run Code Online (Sandbox Code Playgroud)
或者,还有更好的方法?