Java 7中简化的Varargs方法调用

在Java 7中,您可以选择放置@SafeVarargs注释来抑制在使用不可重新生成的varargs参数编译方法时获得的警告。 Project Coin的提议规定,当方法确保只有与varargs参数相同类型的元素存储在varargs数组中时,才应使用注释。

什么是非安全方法的例子?

例如, foo()不安全,它可能在数组中存储非T,导致问题[2]

 > void foo(T... args) { List[] array2 = (List[])args; array2[0] = a_list_of_string; } void test2() { List[] args = ...; // [1] foo(args); Integer i = args[0].get(0); // [2] } 

通过使用@SafeVarargs标记方法,您可以向编译器承诺,您没有做任何顽皮的事情。


但是我们怎么能在[1]开始使用通用数组呢? Java不允许创建通用数组!

通用数组创建的唯一认可方式是调用vararg方法时

 foo( list_int_1, list_int_2 ) 

然后调用者无法访问该数组,调用者无论如何也无法做到[2], foo()如何与数组混淆并不重要。

但是你想一想,它创建通用数组的后门

 @SafeVarargs static  E[] newArray(int length, E... array) { return Arrays.copyOf(array, length); } List[] array1 = newArray(10); 

和通用数组文字

 @SafeVarargs static  E[] array(E... array) { return array; } List[] array2 = array( list1, list2 ); 

所以我们毕竟可以创建通用数组……愚蠢的Java,试图阻止我们这样做。