2011-10-22 17 views
15

In Java 7, è possibile inserire un'annotazione @SafeVarargs per sopprimere l'avviso ricevuto durante la compilazione di un metodo con un parametro varargs non modificabile. Il progetto Coin proposal stabilisce che l'annotazione debba essere utilizzata quando il metodo garantisce che solo gli elementi dello stesso tipo del parametro varargs siano memorizzati nell'array varargs.Invocazione del metodo Varargs semplificata in Java 7

Quale sarebbe un esempio di metodo non sicuro?

risposta

21

Ad esempio, foo() non è sicuro, può memorizzare non T nella matrice, causando problema [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] 
} 

Con il marchio del metodo con @SafeVarargs, si promettono di compilatore che sei non fare nulla di cattivo in quel modo.


Ma come diavolo si può ottenere un generico array a [1] per iniziare? Java non consente la creazione di array generici!

L'unico modo sanzionato di creazione dell'array generico viene quando si chiama un metodo vararg

foo(list_int_1, list_int_2) 

allora la matrice non è accessibile al chiamante, chiamante non può fare [2] in ogni caso, non importa come foo() crei problemi con l'array.

Ma poi ci si pensa, è è la backdoor per creare generico array

@SafeVarargs 
static <E> E[] newArray(int length, E... array) 
{ 
    return Arrays.copyOf(array, length); 
} 

List<String>[] array1 = newArray(10); 

e generico array letterale

@SafeVarargs 
static <E> E[] array(E... array) 
{ 
    return array; 
} 

List<String>[] array2 = array(list1, list2); 

Così abbiamo può creare un array generico, dopo tutto. .. Silly Java, cercando di impedirci di farlo.

+1

È possibile creare array generici senza metodi varargs, ma è necessario utilizzare [Array # newInstance (classe type, int length)] (http://tinyurl.com/3uzbb7v) e trasmetterlo. Grazie per la risposta approfondita. – Jeffrey

+0

Non proprio una "semplificazione", ma un suggerimento migliorato. –

+0

Sto provando questo esempio e non vedo alcun cambiamento nel comportamento con e senza usare @SafeVarargs. Ricevo ancora un avviso "Tipo di sicurezza: una serie generica di Elenco ...." – excalibur

Problemi correlati