Выбор ответа Senior JVM: память, GC, загрузка классов обновлено

ClassCastException: X cannot be cast to X

Вопрос

В сервере приложений получили ClassCastException: com.acme.User cannot be cast to com.acme.User. Что вероятнее всего?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Класс загружен двумя загрузчиками: для JVM это два разных типа. Тип в JVM определяется именем класса и загрузчиком.

Варианты ответа

  1. Разные версии JDK на этапе компиляции и запуска сервера
  2. Класс User не реализует Serializable, и копия не приводится
  3. Ошибка в JIT-компиляторе, который спутал два одинаковых класса
  4. Класс загружен двумя загрузчиками: для JVM это два разных типаправильный ответ

Разбор

Тип в JVM определяется именем класса и загрузчиком. Если один и тот же класс загружен, например, загрузчиком веб-приложения и общим загрузчиком сервера, объекты одного нельзя привести к другому, хотя имена совпадают. Разные версии JDK дают UnsupportedClassVersionError, а не CCE. Serializable тут ни при чём.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме