2011-10-22 47 views
15

在Java 7中,您可以選擇將@SafeVarargs註釋抑制在編譯具有不可變參數varargs參數的方法時得到的警告。 Project Coin的proposal規定,當方法確保只有與varargs參數相同類型的元素存儲在可變參數數組中時,才應使用註釋。Java 7中的簡體可變參數方法調用

什麼是一個非安全方法的例子?

回答

21

例如,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,試圖阻止我們這樣做。

+1

您可以創建不含可變參數方法的泛型數組,但必須使用[Array#newInstance(類類型,int長度)](http://tinyurl.com/3uzbb7v)並將其轉換。感謝徹底的答覆。 – Jeffrey

+0

不是一個「簡化」,而是一個改進的提示。 –

+0

我試着這個例子,我看到沒有和沒有使用@SafeVarargs行爲的變化。我仍然會收到警告「類型安全:列表 ....的通用數組」。 – excalibur

相關問題