令人惊讶的编译错误获取 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<?>
,您也将需要转换。
最近我一直在用反射做很多事情并实现了这个小实用方法。惊奇的发现第一个版本编译不通过,而后面的版本编译通过
不编译:
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<?>
,您也将需要转换。