Учитывая следующую структуру класса:Почему этот список не генерирует исключение ClassCastException?
class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}
И создать список, используя дженерики только на инициализацию и не по ссылке:
List dogs = new ArrayList<Dog>();
Почему этот код генерировать ClassCastException?
dogs.add(new Cat()); // How is Cat casted to Dog??!
Cat cat = (Cat) dogs.get(0); // Return perfectly valid Cat object.
Я понимаю, что не будет никакой ошибки компиляции, поскольку list
ссылка не имеет каких-либо обобщений и будет принимать какие-либо Object
. Но почему JVM генерирует какое-либо исключение, когда я пытаюсь добавить объект Cat?
Дженерики стираются во время выполнения. Дженерики - это функция компиляции. Поскольку, как вы сказали, ваш список является сырым списком, в который вы можете добавить любой объект. _ «Я понимаю, что ошибки компиляции не будет, так как ссылка на список не содержит никаких дженериков», - сказал он. Вы добавляете кошку, а затем получаете кота с индексом 0. – user2336315