I generics in Java, introdotti a partire dalla versione 1.5, consentono di definire un’astrazione sul tipo di oggetto da utilizzare in una classe, similmente a quanto avviene utilizzando i template in C++.

Per creare una classe generica, scriviamo qualcosa simile alla seguente porzione di codice:

public class GenericsTest
{
	public static class Pair<S, T>
	{
		public S first;
		public T second;

		public Pair(S first, T second)
		{
			this.first = first;
			this.second = second;
		}
	}

	public static void main(String[] args)
	{
		Pair<String, Integer> pair =
			new Pair<String, Integer>("Antonio", 22);
		System.out.println(pair.first + ", " + pair.second);
	}
}

S e T saranno due classi generiche, specificate quando si istanzia la classe, come accade nel main.
Da notare la differenza con questo tipo di approccio:

public class GenericsTest
{
	public static class Pair
	{
		public Object first;
		public Object second;

		public Pair(Object first, Object second)
		{
			this.first = first;
			this.second = second;
		}
	}

	public static void main(String[] args)
	{
		Pair pair = new Pair("Antonio", 22);
		Integer i = (Integer)pair.first + (Integer)pair.second;
	}
}

Questo codice potrà essere compilato ma produrrà un errore a runtime.
Utilizzando i generics, invece, verrà prodotto un errore a tempo di compilazione, consentendo di evitare errori subdoli.