Не понимаю по какому принципу создается лист параметризованный WildCard
Необходимо создать лист, принимающий на вход только объекты, наследующиеся от другого класса. В данном примере лист Vehicles, который должен принимать на вход объекты класса Car и Bicycle.
public class Test {
public static void main(String[] args) {
List<? extends Vehicle> vehicles = new ArrayList<>();
vehicles.add(new Car()); // Ошибка компиляции
vehicles.add(new Bicycle());
}
}
class Vehicle{}
class Car extends Vehicle{}
class Bicycle extends Vehicle{}
При этом возникает ошибка компиляции, вариант же с <? super Vehicle> работает как требуется:
public static void main(String[] args) {
List<? super Vehicle> vehicles = new ArrayList<>();
vehicles.add(new Car());
vehicles.add(new Bicycle());
}
Разве в данном коде лист не должен принимать классы стоящие выше по иерархии наследования? То есть, например, чтобы запись <? super Car> принимала бы объект класса vehicle, который стоит выше.