Perché non possiamo fare Elenco mylist = ArrayList ();

Perché non possiamo farlo

List mylist = ArrayList(); 

Supponiamo di poterlo fare. Quindi questo programma dovrebbe andare bene:

 ArrayList bananas = new ArrayList(); List fruit = bananas; fruit.add(new Apple()); Banana banana = bananas.get(0); 

Ovviamente non è sicuro per il tipo: hai finito con una mela nella collezione di banane.

Quello che puoi fare è:

 List fruit = new ArrayList(); 

questo è sicuro, perché il compilatore non ti permetterà quindi di provare ad aggiungere alla lista dei frutti. Sa che è una lista di un tipo di frutta, quindi potresti scrivere:

 Fruit firstFruit = fruit.get(0); 

ma non sa quale tipo esatto di frutta è una lista di, e assicurarsi che non si può fare la cosa sbagliata.

Vedi le FAQ sui generici Java un’altra spiegazione.

Perché non sono dello stesso tipo. Supponete di avere un’altra class figlio di Parent ( Child2 per argomento), sarebbe quindi ansible inserire un’istanza di Child2 in una List , ma digitare type errato per inserirlo in un’istanza di List . L’ereditarietà covariante è un vero problema, ed è supportata solo in Java per i tipi di array (dove può causare problemi dispari).

Dovrebbe essere così, perché possiamo fare: Parent A = new Child ();

Modifica: aspetta, in realtà funziona:

List list = new ArrayList(); List tmp = new ArrayList(); list.addAll(tmp); List tmp2 = new ArrayList(); list.addAll(tmp2);

È solo che il cast diretto non è supportato.