【发布时间】:2016-05-23 08:43:04
【问题描述】:
不得不问这个问题我觉得很傻,但我不明白为什么下面的 Java 代码不能编译:
void <T> doSomething(List<T> items) {
Class<? extends T> clazz = items.get(0).getClass();
...
}
来自 Java 文档:
实际结果类型是 Class 其中 |X|是个 擦除 getClass 所在的表达式的静态类型 叫。例如,此代码片段中不需要强制转换:
数字 n = 0;类 c = n.getClass();
编辑:
-
找到this nice explanation 了解删除静态类型的含义。
-
有一种方法可以使用子类来保存泛型类型信息,称为super type token。一个现已删除的答案很有帮助地指出,Guava 库有一个 convenient utility 来利用它。
-
这里有一个great article,关于反射性地提取泛型类型和一个不错的库,称为GenTyRef,简化了它
-
我派生了 GenTyRef 以添加对使用
AnnotatedTypes 的支持(在 Java 8 中引入)。它被称为GeantyRef(它位于 Maven 中心)
【问题讨论】:
-
我认为这是重复的或至少是矩阵错误,因为我感觉我之前在 SE 上看到过这个问题
-
如果
T是List<String>怎么办?没有Class<List<String>>。 -
Java 中没有
auto?
标签: java generics reflection