Method arguments are contravariant in the subtype, and by the definition of the wildcard, for every type T
that extends Vehicle
Foo<T>
is a subtype of Foo<* extends Vehicle>
. The implication of this is that wildcards are great when you only care about the return type, but dont work in situations like this when you want to pass a value of the type to a method.
The problem is that a user might try to call
List<SpaceShip> l = ...
addCars(l);
if your code were to compile, l
would then be a list of spaceships containing 3 cars. Clearly no good.