I tipi generici ci permettono di definire classi e metodi con attributi e parametri di tipo astratto. In questo modo possiamo scrivere una sola classe o metodo che gestisce un qualsiasi tipo di dato.
Supponiamo di dover scrivere una semplice classe che salvi un valore al suo interno e lo ritorni quando necessario. Questo valore può essere di qualsiasi tipo. Vediamo come fare per non scrivere centomila classi:
public class Contenitore<T> {
//attributi
private T contenuto;
//costruttore
public Contenitore(T contenuto){
this.contenuto = contenuto;
}
//metodi
public T getContenuto() {
return contenuto;
}
}
In Java i tipi generici si mettono tra simbolo minore e maggiore, il nome che viene dato loro è indifferente.
public class Main {
public static void main(String[] args) {
Contenitore<Integer> c1 = new Contenitore<Integer>(10);
Contenitore<Double> c2 = new Contenitore<Double>(5.50);
Contenitore<String> c3 = new Contenitore<String>("una stringa");
System.out.println(c1.getContenuto());
System.out.println(c2.getContenuto());
System.out.println(c3.getContenuto());
}
}
10
5.5
una stringa
Ecco che grazie ai tipi generici mi è bastato scrivere una sola classe per gestire qualsiasi tipo mi vanga passato. Ho dovuto sostituire int con Integer e double con Double poiché i tipi generici di Java lavorano solo con oggetti e non con tipi primitivi.