Is List a subclass of List? Why are Java generics not implicitly polymorphic?

No, a List<Dog> is not a List<Animal>. Consider what you can do with a List<Animal> – you can add any animal to it… including a cat. Now, can you logically add a cat to a litter of puppies? Absolutely not.

// Illegal code - because otherwise life would be Bad
List<Dog> dogs = new ArrayList<Dog>(); // ArrayList implements List
List<Animal> animals = dogs; // Awooga awooga
animals.add(new Cat());
Dog dog = dogs.get(0); // This should be safe, right?

Suddenly you have a very confused cat.

Now, you can’t add a Cat to a List<? extends Animal> because you don’t know it’s a List<Cat>. You can retrieve a value and know that it will be an Animal, but you can’t add arbitrary animals. The reverse is true for List<? super Animal> – in that case you can add an Animal to it safely, but you don’t know anything about what might be retrieved from it, because it could be a List<Object>.

Leave a Comment