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.
È 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
Non proprio una "semplificazione", ma un suggerimento migliorato. –
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