问题描述
正如马克所说,这些类型是不可具体化的,这在以下情况下是一个问题:
try {
doSomeStuff();
} catch (SomeException<Integer> e) {
// ignore that
} catch (SomeException<String> e) {
crashAndBurn()
}
两者SomeException<Integer>
和SomeException<String>
都被擦除为相同的类型,JVM
无法区分异常实例,因此无法判断catch
应该执行哪个块。
解决方法
根据Java 语言规范,第 3 版:
我想了解为什么做出这个决定。通用异常有什么问题?
(据我所知,泛型只是编译时的语法糖,Object
无论如何它们都会在.class
文件中被翻译,所以有效地声明一个泛型类就好像它里面的所有东西都是一个Object
.
如果我错了,请纠正我.)