Чем опасно использование raw type, например List вместо List<String>?
Raw type выключает проверку дженериков для всего выражения: в список строк можно положить число, а ClassCastException появится далеко — при чтении, где компилятор вставил приведение.
- Компилятор лишь предупреждает: unchecked
- Существуют только для совместимости со старым кодом
- Вместо raw — List<?> (безопасно читать) или List<Object>
А ещё Raw-ссылка стирает дженерики даже в несвязанных методах класса
Подробно
Особенно коварно то, что отключается не только проверка конкретного параметра: при работе через raw-ссылку компилятор перестаёт применять дженерик-правила ко всему объявлению, включая параметры, к которым претензий не было. Ошибка проявится потом — при чтении из коллекции, где вставленное приведение бросит ClassCastException, и стектрейс укажет на место чтения, а не на место неправильной записи. Raw types существуют исключительно ради совместимости с кодом, написанным до Java 5, и в новом коде им места нет. Если параметр действительно неважен, правильная форма — безграничный wildcard List<?>: он сохраняет проверки типов, запрещая небезопасное добавление.
Что хотят услышать
- Почему опасно.
- Альтернативы.
Частые ошибки
- Использовать raw type, чтобы «убрать предупреждение компилятора».
- Путать List и List<?> — второе типобезопасно.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Raw type работает медленнее параметризованного из-за проверок в рантайме
- ✗Raw type запрещён и не компилируется начиная с Java 8
- ✓Проверки типов отключаются, и ошибки всплывают как ClassCastException
- ✗Raw type занимает больше памяти
Что спросят дальше
- Чем List<?> отличается от List<Object>?
- Что означает предупреждение unchecked и когда его допустимо подавлять?
Разбор темы
- Дженерики: массивы, varargs и bridge-методы
Почему дженерики не дружат с массивами, heap pollution и @SafeVarargs, синтетические bridge-методы и reifiable-типы.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.