【问题标题】:surprising compilation error getting the array class of a class获取类的数组类的令人惊讶的编译错误
【发布时间】:2015-01-04 19:15:54
【问题描述】:

最近我在反射方面做了很多工作,并实现了这个小实用方法。我惊讶地发现第一个版本不能编译,但后者可以。

不编译:

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

【问题讨论】:

    标签: java generics reflection


    【解决方案1】:

    getClass()的返回类型是Class&lt;?&gt;

    在您的示例中,您将 Class&lt;?&gt; 分配给 Class&lt;T[]&gt;(在 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&lt;?&gt;,您也将需要演员表。

    【讨论】:

    • 啊。我试过了,但即使有抑制警告,intellij 仍然感到不安(关于不可转换类型的红色下划线)。似乎我发现了一个错误。
    • 如果你有演员表,应该没问题。也许您已将 IDE 配置为将此类警告视为错误?我知道你可以在 Eclipse 中做到这一点。
    • 嗯,我在这种错误上寻找调整级别的方法,但没有找到。我还看到 jetbrains 之前已经修复了一个像这样的案例(这里是 youtrack.jetbrains.com/issue/IDEA-105846)作为一个错误,所以我会提交它。
    猜你喜欢
    • 2019-04-25
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2022-06-11
    相关资源
    最近更新 更多