为什么 Java 不允许 Throwable 的泛型子类?

问题描述

正如马克所说,这些类型是不可具体化的,这在以下情况下是一个问题:

try {
   doSomeStuff();
} catch (SomeException<Integer> e) {
   // ignore that
} catch (SomeException<String> e) {
   crashAndBurn()
}

两者SomeException<Integer>SomeException<String>都被擦除为相同的类型,JVM 无法区分异常实例,因此无法判断catch应该执行哪个块。

解决方法

根据Java 语言规范,第 3 版:

如果泛型类是Throwable.

我想了解为什么做出这个决定。通用异常有什么问题?

(据我所知,泛型只是编译时的语法糖,Object无论如何它们都会在.class文件中被翻译,所以有效地声明一个泛型类就好像它里面的所有东西都是一个Object.
如果我错了,请纠正我.)