Какие типы данных можно использовать в Generics в Java?

«Какие типы данных можно использовать в Generics в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Java Generics могут использоваться только ссылочные типы (reference types). Примитивные типы (int, char и т.д.) напрямую не поддерживаются, но их можно использовать через соответствующие классы-обертки (Integer, Character).

Почему только ссылочные типы? Generics реализованы через механизм стирания типов (type erasure) во время компиляции, который работает с Object и его подтипами. Примитивы не наследуются от Object.

Примеры допустимых типов:

  1. Классы:

    class Container<T> {
        private T item;
        public void set(T item) { this.item = item; }
        public T get() { return item; }
    }
    Container<String> stringContainer = new Container<>();
    Container<Integer> intContainer = new Container<>();
  2. Интерфейсы:

    List<String> list = new ArrayList<>();
    Map<Integer, String> map = new HashMap<>();
  3. Массивы (как тип):

    List<String[]> listOfArrays = new ArrayList<>();

Важно: Начиная с Java 7, для сокращения кода используется diamond operator <>, который позволяет компилятору вывести тип из контекста.