令人惊讶的编译错误获取类的数组类

时间:2015-01-04 19:15:55

标签: java generics reflection

最近,我一直在做很多反思,并实施了这个小实用工具。我很惊讶地发现第一个版本不能编译,但后者会编译。

不编译:

 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[]>

1 个答案:

答案 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<?>,你也需要演员。

相关问题