Пожалуйста, обратите внимание на приведенный ниже Java-класс Test.
Почему метод test2() компилируется успешно, а test1() - нет?
import java.util.Arrays;
import java.util.List;
public class Test {
public <N extends Number> List<N> test1(){
//compile error: Type mismatch: cannot convert from List<Integer> to List<N>
return Arrays.asList(1,2,3);
}
public List<? extends Number> test2(){
//no compile error
return Arrays.asList(1,2,3);
}
}
В качестве отступления: N - это параметр типа, который существует только в выводе. Таким образом, это, по сути, произвольное приведение, которое вызывающий может определять контекстно. Как правило, это плохой дизайн: поскольку вызывающий может сделать N любым типом, который он хочет, как функция может вернуть правильный тип? (Есть конкретные случаи, когда это правильно, например Collections.emptyList(), но они редки.)




Будет понятнее, если вы напишете код, вызывающий эти методы.
Например:
public static void main (String args) {
Test obj = new Test();
List<Double> list1 = obj.test1 ();
List<? extends Number> list2 = obj.test2 ();
}
Как видите, выход test1() может быть назначен на List<Double>, что означает, что он не может возвращать List<Integer>.
С другой стороны, выход test2() может быть назначен только List<? extends Number>, или List<? extends Object>, или List<?>, а List<Integer> может быть назначен всем трем.
stackoverflow.com/questions/897935/… помогает?