在使用ArrayList时,如果我们定义了一个父类,并使用其子类的实例作为ArrayList的元素,就会出现一些问题。具体来说,我们可能会遇到两个主要的问题:
对于数组中的元素,只有父类方法才会被调用,子类方法不会被调用。
调用子类方法可能会导致ClassCastException。
这些问题的主要原因是,ArrayList只存储对象的引用,而不是对象本身。因此,当我们使用子类实例向ArrayList中添加元素时,只有父类方法会被调用,因为ArrayList只知道元素是父类的实例。另外,当我们从ArrayList中获取元素时,如果我们尝试调用一个只在子类中定义的方法,就会导致ClassCastException。
解决这些问题的方法是使用泛型。具体来说,我们可以使用ArrayList
示例代码如下:
class Animal {
public void makeSound() {
System.out.println("This animal makes a sound");
}
}
class Dog extends Animal {
public void makeSound() {
System.out.println("Woof!");
}
}
class Cat extends Animal {
public void makeSound() {
System.out.println("Meow!");
}
}
public class Main {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(new Dog());
list.add(new Cat());
for(Animal animal : list) {
animal.makeSound();
}
}
}
在这个示例中,我们定义了一个Animal类和两个子类Dog和Cat。然后,我们创建了一个ArrayList,并将Dog和Cat的实例添加到其中。接下来,我们使用for-each循