public class Foo {
public <T> void foo(final T t) {
final Class<T> clazz = (Class<T>) t.getClass();
}
}
我无法理解为什么t.getClass()
会返回Class<?>
而不是Class<T>
(或Class<? extends T>
),为什么我需要进行投射。
这种演员会以哪种方式失败?
答案 0 :(得分:0)
Java中的泛型是使用类型擦除实现的。
类型T在运行时不存在,编译器将T
替换为java.lang.Object
。所以下面的方法实际上是用字节码编译的:
public void foo(final Object t)
答案 1 :(得分:0)
你应该查找“类型擦除”一词。 Java做泛型的方式是编译“通用”代码。也就是说,它编译可以使用任何类型的代码,并在编译时进行类型检查。