是什么导致嵌套泛型中未经检查的警告?

时间:2014-09-01 08:45:56

标签: java generics compiler-warnings unchecked

当我在方法中使用嵌套泛型时,会出现未经检查的警告。那是为什么?

package test;

public class subc {

    public static void main(String[] args) {
        Integer aa[] = new Integer[10];
        infunction(aa);
        // Not Warning , Use genericTest !!!!!!!!!!!
        Integer[] abc = genericTest(aa, aa.getClass());
        @SuppressWarnings("unused")
        Integer a = abc[0];
    }

    public static <T> T[] genericTest(T[] aa, Class<? extends T[]> class1) {
        return aa;
    }

    public static <T> T[] infunction(T[] aa) {
        // Warning, Use genericTest( unchecked ) !!!!!!!!!!
        T[] result = (T[]) genericTest(aa, aa.getClass());
        return result;
    }
}

如果我修改方法,则没有警告:

public static <T> T[] genericTest(T[] aa) {
    return aa;
}

那么为什么我会在第一个代码块而不是第二个代码块中收到警告?

1 个答案:

答案 0 :(得分:0)

未选中的广告系列是您在代码中明确写明的(T[])广告。 T[]不是可再生类型,因此在运行时不会完全检查它。

我猜你在没有编译的代码没有编译时添加了一个演员。所以真正的问题是为什么T[] result = genericTest(aa, aa.getClass());无法编译。

这是因为aa.getClass()返回了Class<? extends Object[]>类型。 .getClass()方法的实际编译时返回类型(如其文档中所述)为Class<? extends |X|>,其中|X|是表达式.getClass()的静态类型的擦除上。此处aa的类型为T[],其删除为Object[],因此aa.getClass()会返回Class<? extends Object[]>类型。 (.getClass()返回类型的原因我不会在这里讨论。)

由于genericTest的第二个参数的类型为Class<? extends T[]>genericTest的{​​{1}}},T的类型为aa.getClass() ,致电Class<? extends Object[]>T的唯一有效选择是genericTest(aa, aa.getClass())T。因此,Object会返回genericTest(aa, aa.getClass())类型,无法将其分配给Object[]