为什么Java不允许Shrewable的通用子类?
2022-08-31 07:01:35
根据Java语言分离,第3版:
我想了解为什么作出这一决定。通用异常有什么问题?
(据我所知,泛型只是编译时的语法糖,它们无论如何都会在文件中被翻译成,因此有效地声明泛型类就好像它中的所有内容都是一个.如果我错了,请纠正我。Object
.class
Object
根据Java语言分离,第3版:
我想了解为什么作出这一决定。通用异常有什么问题?
(据我所知,泛型只是编译时的语法糖,它们无论如何都会在文件中被翻译成,因此有效地声明泛型类就好像它中的所有内容都是一个.如果我错了,请纠正我。Object
.class
Object
正如mark所说,这些类型是不可重用的,这在以下情况下是一个问题:
try {
doSomeStuff();
} catch (SomeException<Integer> e) {
// ignore that
} catch (SomeException<String> e) {
crashAndBurn()
}
两者都被擦除为相同的类型,JVM无法区分异常实例,因此无法判断应该执行哪个块。SomeException<Integer>
SomeException<String>
catch
这主要是因为它的设计方式很糟糕。
此问题会阻止干净的抽象设计,例如,
public interface Repository<ID, E extends Entity<ID>> {
E getById(ID id) throws EntityNotFoundException<E, ID>;
}
对于泛型,catch 子句将失败的事实没有得到证实,这一事实不能成为这样做的借口。编译器可以简单地禁止扩展 Throwable 的具体泛型类型,或者不允许在 catch 子句中使用泛型。