Generics
Box<T> é uma generic class — T é um placeholder preenchido com um type real onde quer que Box seja usado, então Box<Integer> e Box<String> são ambas instanciações válidas e type-safe da exata mesma class, com o compilador detectando qualquer incompatibilidade de type no ponto de chamada.
public class Main {
static class Box<T> {
private T value;
Box(T value) {
this.value = value;
}
T getValue() {
return value;
}
}
public static void main(String[] args) {
Box<Integer> intBox = new Box<>(42);
Box<String> strBox = new Box<>("hello");
System.out.println(intBox.getValue());
System.out.println(strBox.getValue());
}
}42 hello
Generic methods
Um method pode ser generic por conta própria, independente da sua class — <T> antes do tipo de retorno declara que first(T a, T b) funciona para qualquer type T único, com o compilador inferindo T a partir dos argumentos no ponto de chamada, sem precisar de um type explícito.
public class Main {
static <T> T first(T a, T b) {
return a;
}
public static void main(String[] args) {
System.out.println(first(10, 20));
}
}10
A seguir: o Collections Framework — HashMap e HashSet, dois dos tipos de coleção padrão do Java.
Practice exercise
Defina uma generic class Box<T> com um field value e um method getValue(). Crie um Box<String> contendo "hello", depois imprima seu value.