Generics Java: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Ensahequ (discussione | contributi)
m code->source
Riga 4:
I generics permettono di definire delle [[Astrazione (informatica)|astrazioni]] sui [[Tipo di dato|tipi di dati]] definiti nel linguaggio. L'esempio più comune del loro utilizzo è nella definizione/uso dei, cosiddetti, contenitori. Prima dell'uscita del JDK 1.5 per poter gestire in modo trasparente tipi di dati differenti si doveva ricorrere al fatto che in Java ogni [[Classe (informatica)|classe]] deriva in modo implicito dalla classe ''Object''. Per esempio se si doveva implementare una [[lista concatenata]] il codice era il seguente:
 
<source lang="java">
List myIntList = new LinkedList();
List myIntList.add( = new IntegerLinkedList(0));
myIntList.add(new Integer(0));
</source>
 
e invece per recuperare l'elemento appena inserito si doveva scrivere
 
<source lang="java">
Integer x = (Integer) myIntList.iterator().next();
</source>
 
Si noti il [[Conversione di tipo|cast]] a ''[[Integer]]'' necessario poiché ''myIntList'' in realtà lavora su oggetti ''Object''.
Dall'introduzione del JDK 1.5 invece è possibile utilizzare un codice come il seguente:
 
<source lang="java">
List<Integer> myIntList = new LinkedList<Integer>();
List<Integer> myIntList.add( = new LinkedList<Integer>(0));
myIntList.add(new Integer(0));
</source>
 
dove viene esplicitamente espresso che la lista ''myIntList'' lavorerà solo su oggetti di tipo ''Integer''. Per recuperare l'elemento appena inserito il codice è il seguente:
 
<source lang="java">
Integer x = myIntList.iterator().next();
</source>
 
Si noti che ora il cast non è più necessario visto che la lista è di interi.
Riga 25 ⟶ 33:
== Implementazione ==
Java 5 non ha esteso il linguaggio [[bytecode]] per implementare i generics. Questo vuol dire che i generics sono in realtà solo dei costrutti sintattici, emulati a livello di bytecode tramite il solito meccanismo della classe Object (descritto sopra).<ref>http://www.artima.com/intv/generics2.html</ref> Dichiarare
<source lang="java">
List<Integer> myIntList = new LinkedList<Integer>();
List<Integer> myIntList = new LinkedList<Integer>();
</source>
equivale a livello di codice a dichiarare
<source lang="java">
List myIntList = new LinkedList(); // Lista di Object
List<Integer> myIntList = new LinkedList<Integer>(); // Lista di Object
</source>
e ad eseguire implicitamente le conversioni ''Object->Integer'' e ''Integer->Object'' per leggere e scrivere gli elementi.
 
I generics hanno quindi eliminato i problemi riguardanti la tipizzazione; adesso gli elementi della lista devono essere ''Integer'' e non (per esempio) ''String'', e tale controllo è eseguito a tempo di compilazione. Non hanno però eliminato i problemi di efficienza riguardanti i cast, che implicano frequenti operazioni di [[boxing]] (copia da stack a heap) e [[unboxing]] (copia da heap a stack).
 
==Note==