Почему "Список myList "в качестве аргумента в методе может принимать ArrayList <Number>numberList = new ArrayList <> (); - PullRequest
0 голосов
/ 07 февраля 2020

Когда я экспериментировал с подстановочными знаками с верхней и нижней границей, я нашел следующий фрагмент кода.

    static void numsUpTo(Integer num, List<? super Integer> output) {
    IntStream.rangeClosed(1, num)
            .forEach(output::add);
}

    ArrayList<Integer> integerList = new ArrayList<>();
    ArrayList<Number> numberList = new ArrayList<>();

    numsUpTo(5, integerList);
    numsUpTo(5, numberList);

Я не понимаю, почему

List<? super Integer>

принимает

ArrayList<Number>

в качестве аргумента.

Поскольку Number является суперклассом для Integer, а не Integer для Number, я ожидаю увидеть ошибку.

Ответы [ 3 ]

4 голосов
/ 07 февраля 2020
List<? super Integer>

означает «List (или экземпляр подкласса List), для которого было бы приемлемо добавить Integer к».

ArrayList является подкласс List; и вполне разумно добавить Integer к ArrayList<Number>, потому что все элементы ArrayList должны быть Number с, а Integer является подклассом Number.

1 голос
/ 07 февраля 2020

Скорее всего, вы путаете super с extends. ? super Integer означает, что тип generi c должен быть родительским для Integer или самого Integer, Number - это супер (родительский) класс для Integer, поэтому аргумент является допустимым.

0 голосов
/ 07 февраля 2020

List<? super Integer> означает, что вы можете вызывать метод с аргументом, типизированным как List of Integer или как List любого супертипа типа Integer.

Таким образом, одна альтернатива - дать ему список Integer:

ArrayList<Integer> ints = new ArrayList<>();
ints.add(new Integer(0));
numsUpTo(ints);

или вы можете назвать его списком чисел, например,

List<Number> nums = new ArrayList<>();
nums.add(new Double(1.4));
nums.add(new Integer(3));
numsUpTo(nums);

, или вы можете назвать его списком объектов, например,

List<Object> objects = new LinkedList<>();
objects.add("hello");
objects.add(new Integer(42));
objects.add(new Double(3.14));
numsUpTo(objects);

In во всех этих случаях вполне нормально, если numsUpTo добавляет целые числа в список, потому что целое число всегда является допустимым типом элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...