il compilatore non inferire il tipo, perché si sta un'istanza di un grezzoArrayList
. Ma è abbastanza intelligente da avvertirti che potrebbero esserci problemi quando si lavora con questo oggetto (grezzo).
Vale la pena menzionare il motivo di questo avviso. A causa dello type erasure, le informazioni parametriche (<Integer>
) relative allo List
verranno completamente eliminate in fase di runtime, quando la variabile contiene elementi di tipo Object
. Considerare questo frammento:
List rawList = new ArrayList(); //raw list
rawList.add(new String("hello"));
rawList.add(new Double(12.3d));
List<Integer> intList = rawList; // warning!
Questo frammento verrà compilato, ma genererà alcuni avvisi. Avendo un elenco non elaborato (rawList
), puoi aggiungere qualsiasi tipo non primitivo all'elenco, incluso String
, Double
, ecc. Ma quando assegni questa raccolta a un elenco, che è specificato per contenere gli interi solo, allora questo è un problema. In Runtime riceverai un ClassCastException
quando proverai a recuperare alcuni elementi dallo intList
, che dovrebbe essere un Integer
, ma in realtà è un String
o altro.
Breve storia - non mescolare i tipi non elaborati con Generics!
Nel tuo caso, il compilatore sarebbe forse hanno dedotto il tipo, se si è utilizzato il diamante:
List<Integer> list = new ArrayList<>(); //¯\_(ツ)_/¯
↑↑
fonte
2015-09-07 12:14:09
Perché questo danno al compilatore più informazioni rispetto Lista myList = new ArrayList() in quanto sul lato sinistro le informazioni generiche è availabe –
PKuhn
Perché entrambi sono semanticamente differenti. Omettere il tipo nel diamante è solo un suggerimento sintattico. – lschuetze