The following code has a compilation errors. It is confusing because you think somewhere to find the problem.
import java.util.*; abstract class Animal{ public abstract void checkup(); } class Dog extends Animal{ public void checkup(){ System.out.println("Dog checkup"); } } class Cat extends Animal{ public void checkup(){ System.out.println("Cat checkup"); } } class Bird extends Animal{ public void checkup(){ System.out.println("Bird checkup"); } } public class AnimalDoctorGeneric { private void checkAnimals(ArrayList<Animal> animals){ for(Animal a : animals){ a.checkup(); } } private void addAnimals(List<Animal> animals){ animals.add(new Dog()); } public static void main(String [] args){ List<Animal> animals = new ArrayList<Animal>(); animals.add(new Dog()); animals.add(new Dog()); AnimalDoctorGeneric doc = new AnimalDoctorGeneric(); doc.addAnimals(animals); doc.checkAnimals(animals);// error here!!!! //doc.checkAnimals((ArrayList<Animal>) animals); this line is the correct code //to use checkAnimals method, the argument has to be correct type. //System.out.println(animals.get(1) + " " + animals.get(2)); } } |
To fix the code the easiest way is to cast animals to ArrayList
doc.checkAnimals((ArrayList
The reason is that ArrayList class implements List interface, they are different, List need to be cast to ArrayList in order to satisfy method checkAnimals(ArrayList