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

surprising compilation error getting the array class of a class

最近我一直在用反射做很多事情并实现了这个小实用方法。惊奇的发现第一个版本编译不通过,而后面的版本编译通过

不编译:

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

getClass()的return类型是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<?>,您也将需要转换。