List<String> list = new ArrayList();
visualizzerà l'avviso del compilatore.Perché l'operatore diamond viene utilizzato per il tipo Inference in Java 7?
Tuttavia il seguente esempio compila senza alcun preavviso: List<String> list = new ArrayList<>();
Sono curioso di sapere il motivo per cui l'introduzione dell'operatore diamante è necessaria a tutti. Perché non basta avere inferenza di tipo sul costruttore se il tipo di argomento è assente (come già fatto per i metodi statici in Java e sfruttata da librerie di raccolta come google guava)
EDIT: Usando risposta millimoose come punto di partenza ho guardato che tipo di cancellazione è effettivamente e non è solo rimuovendo tutte le informazioni sul tipo. Compiler in realtà fa un po 'di più (copiato da official doc):
- Sostituire tutti i parametri di tipo di tipi generici con i loro limiti o di un oggetto se i parametri di tipo sono illimitati. Il codice prodotto, quindi, contiene solo classi, interfacce e metodi ordinari.
- Inserire tipi di cast, se necessario, per preservare la sicurezza del tipo.
- Generare metodi bridge per preservare il polimorfismo in tipi generici estesi.
sto supponendo che sia per distinguere questo usare i tipi prime, che rendono il compilatore fare qualcosa diverso complessivamente per motivi di compatibilità. (Un'espressione con un tipo non elaborato viene elaborata in modo diverso rispetto a quella che riguarda i generici.) – millimoose
Probabilmente sarei d'accordo con millimoose, ma dato che i generici vengono cancellati durante il runtime introducendo un nuovo operatore ('solo') per la retrocompatibilità dell'avvertimento del compilatore non mi sembra giusto –
La compatibilità con le versioni precedenti non è per gli avvisi del compilatore. Una dichiarazione come 'Object s = new ArrayList(). Get()' ha il tipo di risultato del lato destro risolto in modo diverso (usando l'algoritmo pre-generico) che dice 'String s = new ArrayList() .get() '. Questo vale anche se si memorizza 'ArrayList' in una variabile intermedia. –
millimoose