ClassCastException в элементах ArrayList - PullRequest
0 голосов
/ 06 мая 2020

Чтобы законно преобразовать объект, этот объект должен быть экземпляром класса преобразования. Очистить. Но как работает приведение типов, когда я помещаю разные типы объектов в ArrayList? Я приведу простой пример.

public class Animal {
    String varAnimal;
}

public class Dog extends Animal{
        String varDog;
}

 public static void main(String[] args) {

        Dog dog = new Dog();  //can see varAnimal and varDog
        Animal animalDog = new Dog();  //can see just varAnimal
        Animal animal = new Animal();  //can see just varAnimal

        ArrayList<Animal> animals = new ArrayList<>();

        animals.add(dog);
        animals.get(0); //can see just varAnimal, but not varDog like it used to.
        System.out.println((((Dog)animals.get(0))).varDog); //prints null

        animals.add(animalDog);
        animals.get(1); //can see just varAnimal
        System.out.println(((Dog)animals.get(1)).varDog);  //prints null

        //they both came as a dog object, but left as an animal object.
        //they both can see varAnimal and varDog when cast to Dog class.

        animals.add(animal);
        animals.get(2); //can see just varAnimal
        //came as an animal, left as an animal
        System.out.println(((Dog)animal).varDog); //ClassCastException

        }

Мои вопросы:

  1. Я знаю, что ArrayList содержит типы объектов. Итак, как я могу применить (Dog) к элементам с индексами 0 и 1, когда они «ушли» как объекты Animal? Разве мне не следует сразу получить ClassCastException? Поскольку Animal не является экземпляром Dog.
  2. Исключение генерируется только для элемента, который появился как объект Animal. Почему это важно, когда все три элемента остались как объект Animal?
  3. Я также заметил, что Java вообще не заботится о ссылках в этом примере. Он просто заботится о типе объекта элемента, а не о ссылках. Но ссылки имеют значение, когда я хочу вызвать переменные / методы данного элемента. Почему?

Надеюсь, кто-нибудь может мне помочь, я действительно запуталась. Спасибо, Стефан

...