Mam pytanie w sprawie Generics. Jak wiadomo istnieje konstrukcja taka:
List<? extends X> ...
Czyli jest to lista do której można wkładać obiekty klas rozszerzająych klasę X.
Ale przecież do listy zadeklarowanej w taki sposób "List<X>" też możemy wkładać obiekty klas rozszerzających klasę X.
Jaki jest wobec tego sens tego zapisu "? extends X"?
Posłużę się przykładem:
import java.util.ArrayList;
import java.util.List;
public class Generics_Test {
public static void main(String[] args) {
List<Vehicle> lv = new ArrayList<Vehicle>();
lv.add(new Car("Mercedes"));
doSth(lv);
}
static void doSth(List<? extends Vehicle> lv){
for (Vehicle vehicle : lv) {
System.out.println(vehicle.getName());
}
// lv.add(new Car("BMW")); nie kompiluje się
}
private static interface Vehicle {
String getName();
}
private static class Car implements Vehicle {
private final String name;
public Car(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
}
}
W metodzie "doSth" odbieram listę jako "List<? extends Vehicle>". Przeglądanie listy jest możliwe, wyciąganie z niej elementów typu Vehicle. Ale już dodanie do takiej listy nowego obiektu typu Car (który przecież spokojnie został dodany w metodzie main) się nie udaje. Żeby ten kod się skompilował musiałbym zmienić ten zapis i napisać "List<Vehicle>", tak samo jak w metodzie main.
Czy ktoś mi może pomóc to zrozumieć, ewentualnie skierować do dogrego źródła tłumaczącego tą różnicę?
Z góry dzięki
Pozdrawiam
Mietek