Можно ли использовать примитивные типы (int, char) в Generics Java?

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

Ответ

Нет, напрямую нельзя. Параметры типов (Generics) в Java работают только с ссылочными типами (объектами). Примитивные типы (int, char, boolean, long и т.д.) не могут быть использованы в качестве аргумента типа.

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

Решение: Используются классы-обертки (Wrapper Classes). Начиная с Java 5, механизм автоупаковки (autoboxing) и распаковки (unboxing) делает работу с ними почти прозрачной.

Пример:

// Допустимо: Использование класса-обертки
List<Integer> integerList = new ArrayList<>();
integerList.add(42); // Автоупаковка: int -> Integer
int value = integerList.get(0); // Распаковка: Integer -> int

// НЕДОПУСТИМО и вызовет ошибку компиляции
// List<int> primitiveList = new ArrayList<>(); // Ошибка!

Важное исключение: Специализированные версии для примитивов существуют в некоторых сторонних библиотеках (например, int[] в коллекциях Eclipse или Trove) и в Java для потоков (IntStream, LongStream).