Ответ
В Java Generics могут использоваться только ссылочные типы (reference types). Примитивные типы (int, char и т.д.) напрямую не поддерживаются, но их можно использовать через соответствующие классы-обертки (Integer, Character).
Почему только ссылочные типы? Generics реализованы через механизм стирания типов (type erasure) во время компиляции, который работает с Object и его подтипами. Примитивы не наследуются от Object.
Примеры допустимых типов:
-
Классы:
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<>(); -
Интерфейсы:
List<String> list = new ArrayList<>(); Map<Integer, String> map = new HashMap<>(); -
Массивы (как тип):
List<String[]> listOfArrays = new ArrayList<>();
Важно: Начиная с Java 7, для сокращения кода используется diamond operator <>, который позволяет компилятору вывести тип из контекста.