【发布时间】:2013-06-02 19:42:17
【问题描述】:
以下代码:
public static void main(String args[]) throws NoSuchFieldException {
List<Integer> li = new ArrayList<Integer>();
ParameterizedType apType = (ParameterizedType) li.getClass().getGenericSuperclass();
Type[] typeArguments = apType.getActualTypeArguments();
int _i = 0;
for (Type type : typeArguments) {
System.out.format("parameterized type %d is: %s", ++_i, type);
}
}
产生:
parameterized type 1 is: E
- 鉴于 E 是类型参数名称,我是否正确理解这是因为类型擦除的影响而应将其解释为“未知”?
- 让我感到奇怪的是,我必须以某种方式特别解释名称“E”(如果存在更多,我想是“S”、“U”等)。如果我有一个“E”类怎么办?此外,方法名称是 get_Actual_TypeArguments。鉴于类型参数用作占位符,就像变量一样,我发现一个方法应该返回变量的名称很奇怪。我在这里遗漏了什么吗?
-
另外,我不清楚为什么我可以将超类转换为 ParameterizedType 而不是类本身。尝试将 li.getClass() 的结果转换为 ParameterizedType 会产生以下编译时错误:
必需:参数化类型 发现:类 其中 CAP#1 是一个新的类型变量: CAP#1 从捕获的 ? 扩展列表扩展列表
我见过这个relevant SO post,但它并没有启发我。
【问题讨论】:
标签: java generics reflection type-erasure