У меня есть суперкласс 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
и любой другой подтип.