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

У меня есть суперкласс Animal и подкласс Dog. В третьем классе у меня есть List, который принимает объекты подтипа и супертипа одновременно.

public class foo{
    public ArrayList<Animal> animals;
    public ArrayList<Animal> copyOfAnimals;

    public foo(ArrayList<Animal> a){
        animals=a;
        copyOfAnimals = new ArrayList<>(a);
   }
}

Хотя это работает нормально, я не могу назвать foo(dog);, что является ArrayList<Dog>. Это дает ошибку.

Если я использую символы подстановки,

public class foo{
    public ArrayList<? extends Animal> animals;
    public ArrayList<Animal> copyOfAnimals;

    public foo(ArrayList<? extends Animal> a){
        animals=a;
        copyOfAnimals = new ArrayList<>(a);
   }
}

приведет к другой ошибке, когда я не смогу выполнить animals.add(anotherAnimal), что важно в моем случае.

Есть ли другое решение для этого? Делает ли Animal abstract решение?

Обновление

class foo - это класс адаптера android Recyclerview, который предназначен для отображения списка как Animal, так и Dog и любой другой подтип.

1 Ответ

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

Вопрос неясен, но вот моя общая рекомендация.

  1. Так как вы планируете хранить любой тип, который реализует Animal, вы должны использовать List<Animal>.

  2. Если вам нужно получить все элементы, которые имеют определенный подкласс , вы должны сгенерировать этот список из списка Animal. Это производные данные . Вы можете сделать это следующим образом:

var dogs = animals.stream()
    .filter(obj -> obj instanceof Dog)
    .map(obj -> (Dog) obj)
    .collect(Collectors.toList());

И попытаться спроектировать Foo:

public class Foo {
    private List<Animal> animals;

    public List<Dog> getDogs() {
        return animals.stream()
            .filter(obj -> obj instanceof Dog)
            .map(obj -> (Dog) obj)
            .collect(Collectors.toList());
    }

    public Foo(List<Animal> animals) {
        this.animals = new ArrayList<>(animals);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...