Originariamente inviato da TrashcanDLM
Quello che non capisco sono i tipi parametrici in pratica! Cosa rappresentano, che valori possono assumere ecc. Diciamo che le parentesi angolari mi confondono molto
Ok, partiamo dalla base:
- String è un Object
- String[] è un Object[]
ma
- List<String> non è un List<Object>
Quest'ultimo punto ti è chiaro? È assolutamente la "base" dei generics.
I generics permettono di creare tipi (classi, interfacce) "generici" e metodi "generici".
Ecco un esempio di classe generica: voglio creare una classe che contiene una coppia di valori dello stesso tipo (due String o due Integer, ecc...) con i relativi metodi getter/setter (in effetti non farebbe molto altro).
Prima di Java 5, avresti dovuto fare CoppiaString, CoppiaInteger, ecc... con una struttura sostanzialmente uguale, cambiando solo i tipi delle due variabili di istanza e i parametri e tipi di ritorno dei setter/getter.
Con i generics puoi fare:
codice:
public class Coppia<E> {
private E primo;
private E secondo;
public E getPrimo() {
return primo;
}
public void setPrimo(E primo) {
this.primo = primo;
}
public E getSecondo() {
return secondo;
}
public void setSecondo(E secondo) {
this.secondo = secondo;
}
}
Quel E tra <> si chiama type variable ed è una specie di "segnaposto". Non è un tipo reale (non c'è, e non serve che esista, una classe/interfaccia chiamata E !).
Quando la classe viene compilata, avviene il processo chiamato "erasure". Ad esempio le variabili di istanza devono diventare di un tipo reale ... E non esiste!
Secondo le regole, una semplice type variable come E, per erasure diventa Object. Quindi le due variabili di istanza, a runtime sono degli Object.
Ma i generics sono controllati in fase di compilazione. Se in un tuo sorgente fai:
Coppia<String> coppiaStr = new Coppia<String>();
Questa è una concrete type instantiation, riferita a ciò che c'è tra <>. Qui c'è un tipo reale, String. E per il compilatore quei E sono String quando viene usata la variabile coppiaStr es.:
coppiaStr.setPrimo("ciao"); // ok
e il compilatore rifiuterà qualunque altra cosa es.:
coppiaStr.setPrimo(123); // errore