最近,我一直在做很多反思,并实施了这个小实用工具。我很惊讶地发现第一个版本不能编译,但后者会编译。
不编译:
public static <T> Class<T[]> getArrayClassOfType(Class<T> componentType) {
return Array.newInstance(componentType, 0).getClass();
}
编译并正常工作:
public static <T> Class<T[]> getArrayClassOfType(Class<T> componentType) {
Class c = Array.newInstance(componentType, 0).getClass();
return c;
}
两个问题:它有什么问题?有更好的方法吗?
这是第一个编译错误:
TypeUtils.java:[12,60] incompatible types: java.lang.Class<capture#1 of ? extends java.lang.Object> cannot be converted to java.lang.Class<T[]>
答案 0 :(得分:4)
getClass()
的返回类型为Class<?>
。
在您的示例中,您将Class<?>
分配给Class<T[]>
(在return语句中),这是错误的,您需要强制转换。
这将编译好:
@SuppressWarnings("unchecked") // added to suppress compiler warning
public static <T> Class<T[]> getArrayClassOfType(Class<T> componentType)
{
return (Class<T[]>) Array.newInstance(componentType, 0).getClass();
}
使用第二个示例,您使用原始类型Class
,它可以正常工作 - 转换原始类型似乎是隐含的。但是,您将收到编译器警告,因为这是一种不鼓励的技术。
如果你正确地将其参数化为Class<?>
,你也需要演员。