当我在方法中使用嵌套泛型时,会出现未经检查的警告。那是为什么?
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;
}
那么为什么我会在第一个代码块而不是第二个代码块中收到警告?
答案 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[]
。