The reason you cannot cast List<String>
to List<Object>
is that it would allow you to violate the constraints of the List<String>
.
Think about the following scenario: If I have a List<String>
, it is supposed to only contain objects of type String
. (Which is a final
class)
If I can cast that to a List<Object>
, then that allows me to add Object
to that list, thus violating the original contract of List<String>
.
Thus, in general, if class C
inherits from class P
, you cannot say that GenericType<C>
also inherits from GenericType<P>
.
N.B. I already commented on this in a previous answer but wanted to expand on it.