kaq*_*qao 18 java generics reflection
我不得不问这个问题,我感到非常愚蠢,但我不明白为什么下面的Java代码没有编译:
void <T> doSomething(List<T> items) {
Class<? extends T> clazz = items.get(0).getClass();
...
}
Run Code Online (Sandbox Code Playgroud)
来自Java doc:
实际的结果类型是Class <?extends | X |> where | X | 是调用getClass的表达式的静态类型的擦除.例如,此代码片段中不需要强制转换:
数n = 0; 班级<?extends Number> c = n.getClass();
编辑:
Era*_*ran 25
静态类型的擦除items.get(0)是Object(因为T在编译期间被擦除).
因此,items.get(0).getClass()返回a Class<? extends Object>而不是a Class<? extends T>,这解释了为什么尝试的分配失败.
这将通过编译:
Class<? extends Object> clazz = items.get(0).getClass();
Run Code Online (Sandbox Code Playgroud)
如果希望该Class方法知道泛型参数,则可以将其作为附加参数传递.
void doSomething(List<T> items, Class<T> clazz) {
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6673 次 |
| 最近记录: |