Because while String
extends Object
, List<String>
does not extend List<Object>
Update:
In general, if Foo
is a subtype (subclass or subinterface) of Bar
, and G
is some generic type declaration, it is not the case that G<Foo>
is a subtype of G<Bar>
.
This is because collections do change. In your case, If List<String>
was a subtype of List<Object>
, then types other than String
can be added to it when the list is referenced using its supertype, as follows:
List<String> stringList = new ArrayList<String>;
List<Object> objectList = stringList;// this does compile only if List<String> where subtypes of List<Object>
objectList.add(new Object());
String s = stringList.get(0);// attempt to assign an Object to a String :O
and the Java compiler has to prevent these cases.
More elaboration on this Java Tutorial page.