Pytania za 100 punktów: czemu to się kompiluje:
class Generic <T> { // tu się różni
private List<Number> numbers;
public void setNumbers(List<Number> numbers) {
this.numbers = numbers;
}
}
class Service<U extends Generic> {
public List<? extends Number> produce() {
return new LinkedList<>();
}
public void process(U generic) {
generic.setNumbers(produce());
}
}
a to nie:
class Generic { // tu się różni
private List<Number> numbers;
public void setNumbers(List<Number> numbers) {
this.numbers = numbers;
}
}
class Service<U extends Generic> {
public List<? extends Number> produce() {
return new LinkedList<>();
}
public void process(U generic) {
generic.setNumbers(produce());
}
}
Błąd kompilacji raczej oczywisty:
method setNumbers in class Generic cannot be applied to given types;
generic.setNumbers(produce());
^
required: List<Number>
found: List<CAP#1>
reason: argument mismatch; List<CAP#1> cannot be converted to List<Number>
where CAP#1 is a fresh type-variable:
CAP#1 extends Number from capture of ? extends Number
1 error
Pytanie jest bardziej o to, czemu wprowadzenie nieużywanego typu parametryzującego klasę Generic wyłącza kontrolę typów?