Почему метод test2 () компилируется успешно, а метод test1 () - нет?

Пожалуйста, обратите внимание на приведенный ниже 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);
    }

}

stackoverflow.com/questions/897935/… помогает?

GhostCat 04.12.2018 15:14
stackoverflow.com/questions/30498190/…
xingbin 04.12.2018 15:19

В качестве отступления: N - это параметр типа, который существует только в выводе. Таким образом, это, по сути, произвольное приведение, которое вызывающий может определять контекстно. Как правило, это плохой дизайн: поскольку вызывающий может сделать N любым типом, который он хочет, как функция может вернуть правильный тип? (Есть конкретные случаи, когда это правильно, например Collections.emptyList(), но они редки.)

Daniel Pryden 04.12.2018 15:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Будет понятнее, если вы напишете код, вызывающий эти методы.

Например:

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> может быть назначен всем трем.

Другие вопросы по теме