Чтобы законно преобразовать объект, этот объект должен быть экземпляром класса преобразования. Очистить. Но как работает приведение типов, когда я помещаю разные типы объектов в 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
}
Мои вопросы:
- Я знаю, что ArrayList содержит типы объектов. Итак, как я могу применить (Dog) к элементам с индексами 0 и 1, когда они «ушли» как объекты Animal? Разве мне не следует сразу получить ClassCastException? Поскольку Animal не является экземпляром Dog.
- Исключение генерируется только для элемента, который появился как объект Animal. Почему это важно, когда все три элемента остались как объект Animal?
- Я также заметил, что Java вообще не заботится о ссылках в этом примере. Он просто заботится о типе объекта элемента, а не о ссылках. Но ссылки имеют значение, когда я хочу вызвать переменные / методы данного элемента. Почему?
Надеюсь, кто-нибудь может мне помочь, я действительно запуталась. Спасибо, Стефан