Generics Java: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
→Erasure: correzione accento |
m tag source deprecati, replaced: <source lang= → <syntaxhighlight lang= (16), </source> → </syntaxhighlight> (16) |
||
Riga 12:
Invece di utilizzare (codice che potrebbe generare un errore di casting):
<
String title=((String) words.get(i)).toUppercase();
</syntaxhighlight>
o più correttamente per evitare errori
<
Object o=words.get(i);
String title="";
if(o instanceof String)
title=((String) o.get(i)).toUppercase();
</syntaxhighlight>
verrà utilizzato:
<
String title=words.get(i).toUppercase();
</syntaxhighlight>
Vi sono però anche degli svantaggi:
Riga 33:
Si definisce:
<
List<String> words=new ArrayList<String>();
</syntaxhighlight>
invece di:
<
List words=new ArrayList();
</syntaxhighlight>
L'esempio più comune del loro utilizzo è nella definizione/uso dei cosiddetti ''[[container (informatica)|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:
<
List myIntList = new LinkedList();
myIntList.add(new Integer(0));
</syntaxhighlight>
e invece per recuperare l'elemento appena inserito si doveva scrivere
<
Integer x = (Integer) myIntList.iterator().next();
</syntaxhighlight>
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:
<
List<Integer> myIntList = new LinkedList<Integer>();
myIntList.add(new Integer(0));
</syntaxhighlight>
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:
<
Integer x = myIntList.iterator().next();
</syntaxhighlight>
Si noti che ora il cast non è più necessario visto che la lista è di interi.
Riga 74:
== 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 Generics in C#, Java, and C<!-- Titolo generato automaticamente -->]</ref> Dichiarare
<
List<Integer> myIntList = new LinkedList<Integer>();
</syntaxhighlight>
equivale a livello di codice a dichiarare
<
List myIntList = new LinkedList(); // Lista di Object
</syntaxhighlight>
e ad eseguire implicitamente le conversioni ''Object->Integer'' e ''Integer->Object'' per leggere e scrivere gli elementi.
Riga 100:
Per verificarlo, creiamo due liste:
<
LinkedList<Number> l1 = new LinkedList<Number>();
LinkedList<Integer> l2 = new LinkedList<Integer>();
</
E consideriamo i due possibili assegnamenti l1 = l2 e l2 = l1; si
Riga 111:
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.
<
List<Number> numbers = new ArrayList<Number>();
numbers.add(2);
numbers.add(3.14d);
assert numbers.toString().equals("[2, 3.14]");
</
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:
<
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]");
</
== Tipi parametrici varianti (Wildcard) ==
Riga 139:
== Definizione di una classe generica ==
Ecco un esempio di classe generics
<
public class Gen<X,Y> {
Riga 162:
}
}
</
Questa classe non serve a nulla da sola, deve essere quindi utilizzata un'altra struttura, come nell'esempio successivo:
<
Gen<String, String> esempio1 = new Gen<String, String>("esempio", "uno");
Riga 174:
System.out.println("secondo esempio: " + esempio2);
</
==Note==
|