When learning about Java Wildcards i found myself misunderstanding about this theme, so.
Upper Bound
allows me to read-only members of generic classLower Bound
allows me to write to member, but only if it is the types lower bound
List<? extends Vehicle> vehicleList = new ArrayList<Car>();
vehicleList.add(new Scooter()); // Compile-time Error!
Compiler won't let us write anything here, because he can't ensure that elements of list would be the correct type (for later reading).
List<? super Car> carList = new ArrayList<Car>();
carList.add(new Car()); // Ok
carList.add(new Vehicle()); // Compile-time Error
This happens because compiler can ensure that lowest type is always Car. And then we can pass it only Car. Am I right?