当我在研究仿制药时,我注意到了一些事情。在下面的示例中,doStuff1
编译但doStuff2
不编译:
public <T extends Foo> void doStuff1(T value) {
Class<? extends Foo> theClass = value.getClass();
}
public <T extends Foo> void doStuff2(T value) {
Class<? extends T> theClass = value.getClass();
}
因此,我查阅了文档Object.getClass()
并发现了这一点:
实际结果类型是 Class<? 扩展 |X|> 其中 |X| 是调用 getClass 的表达式的静态类型的擦除。
这让我有点好奇。为什么要getClass()
这样设计?如果适用的话,我可以理解将类型转换为它们的原始类,但我看不出为什么他们必须让它也被杀死的明显原因T
。是否有特定的原因让它也摆脱它,或者它只是一般的“让我们摆脱一切,因为它更容易;无论如何谁会需要它”的方法?