AnyCompiler

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());
    }
}
Output
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));
    }
}
Output
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.