==== Generika ==== Generika umožňují vytvářet třídy a metody "on demand" parametrizované nějakou jinou třídou (ale nikoliv např. číslem, což je možné např. v C++, kde se to nazývá "templates" neboli šablony). === Generická třída a rozhraní === Jednoduchý příklad: /** * Generic version of the Box class. * @param the type of the value being boxed */ public class Box { // T stands for "Type" private T t; public void set(T t) { this.t = t; } public T get() { return t; } } A zde volání Box integerBox = new Box(); Jiný a lepší příklad public interface Pair { public K getKey(); public V getValue(); } public class OrderedPair implements Pair { private K key; private V value; public OrderedPair(K key, V value) { this.key = key; this.value = value; } public K getKey() { return key; } public V getValue() { return value; } } inicializace OrderedPair class: Pair p1 = new OrderedPair("Even", 8); Pair p2 = new OrderedPair("hello", "world"); Java 7 zkrátí na OrderedPair p1 = new OrderedPair<>("Even", 8); OrderedPair p2 = new OrderedPair<>("hello", "world"); Pro ty co se neztratili OrderedPair> p = new OrderedPair<>("primes", new Box(...)); === Generická metoda === Nemusí být generická celá třída, generickou lze udělat i samotnou metodu: public class ListCreator { public static List createList(T ... elements) { List list = new ArrayList(elements.length); for (T element : elements) { list.add(element); } return list; } } Ono '''' před signaturou metody je ekvivalentní stejnému '''' za názvem třídy, akorát negeneralizujeme celou třídu, ale samotnou metodu. Když generické metody voláme, můžeme buď nechat typ odvodit: List ints = ListCreator.createList(1, 3); System.out.println(ints); System.out.println("Types: " + ints.get(0).getClass().getSimpleName() + ", " +ints.get(1).getClass().getSimpleName()); List strings = ListCreator.createList("ab", "cd"); System.out.println(strings); System.out.println("Types: " + strings.get(0).getClass().getSimpleName() + ", " +strings.get(1).getClass().getSimpleName()); Produkuje [1, 3] Types: Integer, Integer [ab, cd] Types: String, String Nebo jej ručně specifikovat voláním ve tvaru: List ints = ListCreator.createList(1, 3); Zde ale postrádá smysl, protože není jiná možnost než tato.