public class Coppia {
private final P primo;
private final S secondo;
public P getPrimo() {
return primo; }
public S getSecondo() {
return secondo; }
public Coppia(P primo, S secondo) {
this.primo = primo;
this.secondo = secondo; }}
In una classe generica i parametri di tipo appaiono nell'intestazione che dichiara la classe
**non nel costruttore!**
Coppia c = new Coppia("Ciao", 1);
assert c.getPrimo().equals("Ciao") && c.getSecondo().equals(1);
OK
Coppia c = new Coppia("Ciao",1);
__Warning__! __UncheckedWarning__ L'istruzione è legale ma genera un warning //(non è detto che valga la Cast Iron Guarantee)//
===== Static =====
List interi = Arrays.asList(1,2,3);
List stringhe = Arrays.asList("ciao","mondo");
assert interi.getClass() == stringhe.getClass();
I generics sono implementati tramite **type erasure** List
public class Cella {
private final int id;
private final T valore;
public static int count = 0;
public static synchronized int getCount() { return count;}
public static synchronized int nextId() { return count++;}
public int getId() { return id; }
public T getValore() { return valore;}
public Cella( T valore) { this.id = nextId(); this.valore = valore;}
...
Vediamo la classe all'opera
Cellacs = new Cella("ciao");
Cella ci = new Cella(1);
assert cs.getId() == 0 && ci.getId() == 1
&& Cella.getCount() == 2;
Il contatore è condiviso tra tutte le istanze della classe Cella
==== Utilizzo di metodi static ====
* Cella.getCount() OK
* Cella
public class Esterna { ...
private class Interna1{
Gg =null; ...
} ...
}
==== Inner class statica: escamotage ====
public class Esterna { ...
public G getPippo() { return new Interna2().getPippo();
} public static class Interna2{
public H getPippo() { ...
} ...