Why aren't Java's generics implicitly polymorphic?
I'm a bit confused about how Java generics handle inheritance / polymorphism.

Assume the following hierarchy -

**Animal** (Parent)

**Dog** - **Cat** (Children)

So suppose I have a method `doSomething(List<Animal> animals)`. By all the rules of inheritance and polymorphism, I would assume that a `List<Dog>` *is* a `List<Animal>` and a `List<Cat>` *is* a `List<Animal>` - and so either one could be passed to this method. Not so. If I want to achieve this behavior, I have to explicitly tell the method to accept a list of any subset of Animal by saying `doSomething(List<? extends Animal> animals)`. 

I understand that this is Java's behavior. My question is *why*? Why is polymorphism generally implicit, but when it comes to generics it must be specified?

Why aren't Java's generics implicitly polymorphic?
===

I'm a bit confused about how Java generics handle inheritance / polymorphism.

Assume the following hierarchy -

**Animal** (Parent)

**Dog** - **Cat** (Children)

So suppose I have a method `doSomething(List<Animal> animals)`. By all the rules of inheritance and polymorphism, I would assume that a `List<Dog>` *is* a `List<Animal>` and a `List<Cat>` *is* a `List<Animal>` - and so either one could be passed to this method. Not so. If I want to achieve this behavior, I have to explicitly tell the method to accept a list of any subset of Animal by saying `doSomething(List<? extends Animal> animals)`. 

I understand that this is Java's behavior. My question is *why*? Why is polymorphism generally implicit, but when it comes to generics it must be specified?
