Java 如何上课<;T>;从列表<;T>;

Java 如何上课<;T>;从列表<;T>;,java,generics,reflection,Java,Generics,Reflection,我觉得问这个问题非常愚蠢,但我不明白为什么下面的Java代码不能编译: void <T> doSomething(List<T> items) { Class<? extends T> clazz = items.get(0).getClass(); ... } void doSomething(列表项){ Class删除静态类型的项。get(0)是对象(因为T在编译过程中被删除) 因此items.get(0).getClass()返回一个C

我觉得问这个问题非常愚蠢,但我不明白为什么下面的Java代码不能编译:

void <T> doSomething(List<T> items) {
    Class<? extends T> clazz = items.get(0).getClass();
    ...
}
void doSomething(列表项){

Class删除静态类型的
项。get(0)
对象
(因为
T
在编译过程中被删除)


因此
items.get(0).getClass()返回一个
Class首先,您需要定义T作为方法的类型参数:
void doSomething
。然后您需要对
Class
Class
进行强制转换concise@user140547我在学习Javadoc的语言(
Class@Eran
ClassHmm,这并不能解释为什么结果只包含“表达式的静态类型的擦除”而不是“表达式的静态类型”…@Holger:这是因为
T
可以表示像
ArrayList
这样的不可恢复类型。但是类对象只表示可恢复类型。只有一个
class
,而不是
class
。奇怪的是,擦除是如何迫使我们再次进行转换的。缺少的是一个打字错误。转换显然是有效的,但我需要一个解释作为补充我认为这是重复的,或者至少是矩阵错误,因为我觉得我在前面看到过这个问题,如果
T
List
,那怎么办?没有
Class
。Java中没有
auto
Class<? extends Object> clazz = items.get(0).getClass();
void doSomething(List<T> items, Class<T> clazz) {

}
<T> void doSomething(List<T> items) {
    Class<? extends T> clazz = (Class<? extends T>) items.get(0).getClass();
    ...
}