Java 获取类的数组类时出现意外编译错误
最近我做了很多关于反射的工作,并实现了这个小实用方法。我惊讶地发现,第一个版本没有编译,但后一个版本编译 不编译:Java 获取类的数组类时出现意外编译错误,java,generics,reflection,Java,Generics,Reflection,最近我做了很多关于反射的工作,并实现了这个小实用方法。我惊讶地发现,第一个版本没有编译,但后一个版本编译 不编译: public static <T> Class<T[]> getArrayClassOfType(Class<T> componentType) { return Array.newInstance(componentType, 0).getClass(); } 公共静态类getArrayClassOfType(类componen
public static <T> Class<T[]> getArrayClassOfType(Class<T> componentType) {
return Array.newInstance(componentType, 0).getClass();
}
公共静态类getArrayClassOfType(类componentType){
返回Array.newInstance(componentType,0).getClass();
}
编译并运行良好:
public static <T> Class<T[]> getArrayClassOfType(Class<T> componentType) {
Class c = Array.newInstance(componentType, 0).getClass();
return c;
}
公共静态类getArrayClassOfType(类componentType){
类c=Array.newInstance(componentType,0.getClass();
返回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[]>
TypeUtils.java:[12,60]不兼容的类型:java.lang.Class无法转换为java.lang.Class
getClass()的返回类型是Class
在您的示例中,您将类
赋值给类
(在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();
}
@SuppressWarnings(“unchecked”)//添加到抑制编译器警告
公共静态类getArrayClassOfType(类componentType)
{
return(Class)Array.newInstance(componentType,0.getClass();
}
在第二个示例中,您使用了raw type类
,它工作正常-铸造raw type似乎是隐式的。但是,您将得到一个编译器警告,因为这是一种不鼓励使用的技术
如果您正确地将其参数化为
类
,您也需要强制转换。啊。我试过了,但intellij仍然不高兴(关于不可转换类型的红色下划线),即使有抑制警告。看来我发现了一个错误。如果你有演员阵容,应该没问题。也许您已将IDE配置为将此类警告视为错误?我知道你可以在Eclipse中做到这一点。嗯,我想办法调整这种错误的级别,但没有找到。我还看到jetbrains之前已经将这样一个案例(这里)修复为一个bug,所以我将提交它。