为什么Java不允许Shrewable的通用子类?

2022-08-31 07:01:35

根据Java语言分离,第3版:

如果泛型类是 Throwable 的直接或间接子类,则为编译时错误。

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

(据我所知,泛型只是编译时的语法糖,它们无论如何都会在文件中被翻译成,因此有效地声明泛型类就好像它中的所有内容都是一个.如果我错了,请纠正我。Object.classObject


答案 1

正如mark所说,这些类型是不可重用的,这在以下情况下是一个问题:

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

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


答案 2

这主要是因为它的设计方式很糟糕。

此问题会阻止干净的抽象设计,例如,

public interface Repository<ID, E extends Entity<ID>> {

    E getById(ID id) throws EntityNotFoundException<E, ID>;
}

对于泛型,catch 子句将失败的事实没有得到证实,这一事实不能成为这样做的借口。编译器可以简单地禁止扩展 Throwable 的具体泛型类型,或者不允许在 catch 子句中使用泛型。