Generics Java: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica |
|||
Riga 88:
Se un elemento Y deriva da un elemento X, non si può dire che una collezione di elementi di Y derivi dalla collezione di elementi X, perché in generale ciò risulta un'operazione impossibile; solo alcune di questo potrebbero essere anche sicuri, soprattutto per ciò che riguarda gli array e la lettura, ma ciò non è vero in generale.
Consideriamo la classe generica ''LinkedList <T>'':
prendiamo due sue '''istanziazioni''': ''LinkedList <Number>'' e ''LinkedList<Integer>''.
Sono due tipi differenti, incompatibili fra loro, anche se ''Integer'' estende ''Number''; situazione in contrasto a quella che si verifica negli array, dove ''Integer[]'' è un sottotipo di ''Number[]''.
Per verificarlo, creiamo due liste:
<source lang="java">
LinkedList<Number> l1 = new LinkedList<Number>();
LinkedList<Integer> l2 = new LinkedList<Integer>();
</source>
E consideriamo i due possibili assegnamenti l1 = l2 e l2 = l1; si
ottiene in ogni caso errore perché
''LinkedList<Integer>'' non estende ''LinkedList<Number>''.
Gli assegnamenti in precedenza sono impossibili perché viene violato '''il principio di sostituzione''': Ad una variabile di un certo tipo può essere assegnato un valore di ogni sottotipo; un metodo con un argomento di un certo tipo può essere chiamato con un argomento di ogni sottotipo.
<source lang="java">
List<Number> numbers = new ArrayList<Number>();
numbers.add(2);
numbers.add(3.14d);
assert numbers.toString().equals("[2, 3.14]");
</source>
Qui il principio vale fra ''List'' e ''ArrayList'' e fra ''Number'' e ''Integer Double'' in maniera rispettiva.
''List<Integer>'' invece '''non è un sottotipo''' di ''List<Number>'' in quanto viene violato nuovamente '''il principio di sostituzione''', ad esempio:
<source lang="java">
List<Integer> integers = Arrays.asList(1, 2);
List<Number> numbers = integers; // non compila
numbers.add(3.14d);
assert integers.toString().equals("[1, 2,3.14]");
</source>
== Tipi parametrici varianti (Wildcard) ==
|