例如,
foo()不安全,可能会将非T存储在数组中,从而在[2]处引起问题
<T extends List<?>> void foo(T... args){ List<String>[] array2 = (List<String>[])args; array2[0] = a_list_of_string;}void test2(){ List<Integer>[] args = ...; // [1] foo(args); Integer i = args[0].get(0); // [2]}通过使用@SafeVarargs标记该方法,您可以向编译器保证您不会做任何类似的事情。
但是如何在[1]处获得通用数组呢?Java不允许创建通用数组!
通用数组创建的唯一批准方式是调用vararg方法时
foo( list_int_1, list_int_2 )
则调用者无法访问该数组,调用者无论如何也无法执行[2],
foo()与该数组的混乱程度无关。
但是然后您考虑一下,这 是 创建通用数组的后门
@SafeVarargsstatic <E> E[] newArray(int length, E... array){ return Arrays.copyOf(array, length);}List<String>[] array1 = newArray(10);和通用数组文字
@SafeVarargsstatic <E> E[] array(E... array){ return array;}List<String>[] array2 = array( list1, list2 );因此,我们毕竟 可以 创建通用数组…愚蠢的Java,试图阻止我们这样做。



