==== 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.