Java Как список может содержать одновременно и супертип, и подтип? - PullRequest
0 голосов
/ 22 января 2020

У меня есть класс, скажем Animal и подкласс Dog. Я хочу иметь List с именем allAnimals, который может одновременно хранить объекты Animal и Dog. В настоящее время он настроен как List<Animal> allAnimals. Я хочу иметь возможность выполнять две задачи:

  1. Добавить супертипы и подтипы .

    List<Dogs> dogs = new List<>();
    ...
    allAnimals.addAll(dogs);
    
  2. Я хочу иметь возможность передавать любой подтип или супертип в список в качестве параметра метода.

    public void foo(List<Animal> animals){...}
    ...
    foo(allAnimals);
    or
    foo(dogs);
    

Возможно ли вышеизложенное? В этом случае подстановочный знак <? extends Animal> выдает ошибку, поскольку foo одновременно помещает объекты в список и удаляет их. Нужно ли сделать Animal класс абстрактным, чтобы добиться этого?

Ответы [ 3 ]

0 голосов
/ 22 января 2020

Вы можете попробовать что-то вроде этого:

public class Test {
    public void accept(List<? extends Animal> animals) {
        List<? super Animal> container = new ArrayList<>();
        container.add(animals.get(0));
        System.out.println(animals);
    }
    public void test() {
        List<Animal> animals = new ArrayList<>();
        accept(animals);

        List<Dog> dogs = new ArrayList<>();
        accept(dogs);
    }
}
0 голосов
/ 22 января 2020

В List указано: addAll(Collection<? extends E> c), так что работает:

animals.addAll(dogs);

То же самое для вашего метода:

void foo(List<? extends Animal> animals) {
}

Супертип указанного не возможен (foo(new Object()) в качестве параметра.

0 голосов
/ 22 января 2020
List<? super Animal> animalList = new ArrayList<>();
animalList.add(new Animal());
animalList.add(new Dog("Snoopy"));
animalList.addAll(dogs);

, поэтому этот список является изменяемым и может содержать все животные и его подклассы, такие как собака. Имейте в виду, что List<Dog> не является экземпляром List<Animal>.

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

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