18. Generici

In Java i generici consentono di avere tipi come parametri di una classe: è possibile dichiarare metodi e/o classi generiche.

Classi generiche

Una classe generica è una classe che dipende da un tipo non specificato. Per convenzione il nome del tipo inizia con una maiuscola e, quando possibile, consiste in una sola lettera.

public class GenericTest<E>{
	private E var;
	
	public GenericTest(E var){
		this.var = var;
	}
	
	public E getVar(){
		return var;
	}

	public void setVar(E var){
		this.var = var;
	}
}

Quando si vuole definire un’istanza di una classe generica occorre indicare il tipo di dato che si passa come parametro: è possibile usare un qualsiasi tipo di riferimento (tipi che definiscono oggetti), ma NON tipi di dato primitivi.

GenericTest<Integer> intero = new GenericTest<Integer>(10);

Metodi generici

I metodo generici sono metodi che usano tipi generici dei parametri.

class PrintArrayGeneric{
	public <E> void printArray(E el[]){
		for(E a : el){
			System.out.println(a);
		}
	}
}

Wildcard

Il carattere wildcard (?)può essere usato per rappresentare un tipo non definito.

Può essere usato come:

È possibile vincolare il tipo specificato tramite wildcard ad essere un sottotipo di un tipo dato, ad esempio:

public void wildMethod(Collection <? extends SuperClass> collection);

In questo caso il metodo può gestire le sottoclassi di SuperClass.

È possibile vincolare il tipo specificato tramite wildcard ad essere un tipo ereditato da un tipo dato, ad esempio:

public void wildMethod(Collection <? super SubClass> collection);

In questo caso il metodo può gestire le super-classi di SubClass.