15
在Java 7中,您可以選擇將@SafeVarargs
註釋抑制在編譯具有不可變參數varargs參數的方法時得到的警告。 Project Coin的proposal規定,當方法確保只有與varargs參數相同類型的元素存儲在可變參數數組中時,才應使用註釋。Java 7中的簡體可變參數方法調用
什麼是一個非安全方法的例子?
在Java 7中,您可以選擇將@SafeVarargs
註釋抑制在編譯具有不可變參數varargs參數的方法時得到的警告。 Project Coin的proposal規定,當方法確保只有與varargs參數相同類型的元素存儲在可變參數數組中時,才應使用註釋。Java 7中的簡體可變參數方法調用
什麼是一個非安全方法的例子?
例如,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不允許創建通用數組!
唯一的通用數組創建的制裁方式調用可變參數方法
foo(list_int_1, list_int_2)
則數組是不是調用者訪問時,主叫方不能做[2]反正也無所謂foo()
如何與數組混淆。
但你想想,它是借殼創建通用陣列
@SafeVarargs
static <E> E[] newArray(int length, E... array)
{
return Arrays.copyOf(array, length);
}
List<String>[] array1 = newArray(10);
和通用陣列字面
@SafeVarargs
static <E> E[] array(E... array)
{
return array;
}
List<String>[] array2 = array(list1, list2);
所以我們可以創建通用陣列畢竟。愚蠢的Java,試圖阻止我們這樣做。
您可以創建不含可變參數方法的泛型數組,但必須使用[Array#newInstance(類>類型,int長度)](http://tinyurl.com/3uzbb7v)並將其轉換。感謝徹底的答覆。 – Jeffrey
不是一個「簡化」,而是一個改進的提示。 –
我試着這個例子,我看到沒有和沒有使用@SafeVarargs行爲的變化。我仍然會收到警告「類型安全:列表 ....的通用數組」。 –
excalibur