Il problema con
List<String> list = new LinkedList();
è quello sul lato sinistro, stai usando il tipo genericoList<String>
dove sul lato destro stai usando il tipo grezzoLinkedList
. I tipi grezzi in Java esistono effettivamente solo per compatibilità con il codice pre-generico e non dovrebbero mai essere usati nel nuovo codice a meno che non sia assolutamente necessario.
Ora, se Java avesse generici dall'inizio e non avesse tipi, come quelli LinkedList
che erano stati originariamente creati prima dei generici, probabilmente avrebbe potuto farlo in modo che il costruttore di un tipo generico infetti automaticamente i suoi parametri di tipo da sinistra lato dell'incarico, se possibile. Ma non è così, e deve trattare i tipi grezzi e quelli generici in modo diverso per la compatibilità con le versioni precedenti. Ciò lascia loro la necessità di creare un modo leggermente diverso , ma ugualmente conveniente, di dichiarare una nuova istanza di un oggetto generico senza dover ripetere i suoi parametri di tipo ... l'operatore diamante.
Per quanto riguarda l'esempio originale di List<String> list = new LinkedList()
, il compilatore genera un avviso per quell'assegnazione perché deve. Considera questo:
List<String> strings = ... // some list that contains some strings
// Totally legal since you used the raw type and lost all type checking!
List<Integer> integers = new LinkedList(strings);
I generici esistono per fornire protezione in fase di compilazione dal fare la cosa sbagliata. Nell'esempio sopra, l'utilizzo del tipo raw significa che non si ottiene questa protezione e verrà visualizzato un errore in fase di esecuzione. Questo è il motivo per cui non dovresti usare tipi grezzi.
// Not legal since the right side is actually generic!
List<Integer> integers = new LinkedList<>(strings);
L'operatore diamante, tuttavia, consente di definire il lato destro dell'assegnazione come una vera istanza generica con gli stessi parametri di tipo del lato sinistro ... senza dover digitare nuovamente tali parametri. Ti consente di mantenere la sicurezza dei generici con quasi lo stesso sforzo dell'utilizzo del tipo grezzo.
Penso che la cosa chiave da capire sia che i tipi grezzi (senza no <>
) non possono essere trattati allo stesso modo dei tipi generici. Quando dichiari un tipo grezzo, non ottieni nessuno dei vantaggi e la verifica del tipo di generici. Devi anche tenere presente che i generici sono una parte generica del linguaggio Java ... non si applicano solo ai costruttori no-arg di Collection
s!