Mi sono imbattuto in qualcosa di molto semplice ma estremamente sconcertante oggi. Avevo bisogno di convertire una lista in un array. L'elenco conteneva istanze String
. Esempio perfetto di utilizzo di List.toArray(T[])
, poiché volevo un'istanza String[]
. Tuttavia, non funzionerebbe senza il risultato esplicito del risultato su String[]
.Comportamenti generici dispari di List.toArray (T [])
Come scenario di test, ho usato il seguente codice:
import java.util.Arrays;
import java.util.List;
public class MainClass {
public static void main(String args[]) {
List l = Arrays.asList("a", "b", "c");
String stuff[] = l.toArray(new String[0]);
System.err.println(Arrays.asList(stuff));
}
}
, che non può essere compilato. E 'quasi una copia esatta della esempio nel javadoc, ma il compilatore dice quanto segue:
MainClass.java:7: incompatible types
found : java.lang.Object[]
required: java.lang.String[]
String stuff[] = l.toArray(new String[0]);
^
Se posso aggiungere un cast di String[]
verrà compilare ed eseguire perfettamente. Ma questo non è quello che mi aspetto quando ho guardato la firma del metodo toArray:
<T> T[] toArray(T[] a)
Questo mi dice che non avrei dovuto lanciare. Cosa sta succedendo?
Edit:
Curiosamente, se cambio la dichiarazione l'elenco a:
List<?> l = Arrays.asList("a", "b", "c");
funziona anche. O List<Object>
. Quindi non deve essere un List<String>
come è stato suggerito. Sto iniziando a pensare che l'uso del tipo grezzo List
cambi anche il modo in cui funzionano i metodi generici all'interno di quella classe.
Seconda modifica:
penso ho capito ora. Quello che Tom Hawtin ha scritto in un commento qui sotto sembra essere la migliore spiegazione. Se si utilizza un tipo generico nel modo raw, tutte le informazioni generiche da quell'istanza verranno cancellate dal compilatore.
Questo ha senso per me logicamente, ma non tecnicamente. Non mi sembra che il metodo toArray si preoccupi di ciò a cui E è vincolato (vale a dire, la classe di elemento dell'elenco). – waxwing
la firma di toArray è "public T [] toArray (T [] a)", T è il tipo di componente della matrice passata in –
dfa
Inoltre non riesco a capirlo, peggio è che funziona anche utilizzando una lista