Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取类的数组类时出现意外编译错误_Java_Generics_Reflection - Fatal编程技术网

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,所以我将提交它。