Возьмите следующий пример дженериков
import java.util.List;
import java.util.ArrayList;
public class GenericsTest {
private List<Animal> myList;
public static void main(String args[]) {
new GenericsTest(new ArrayList<Animal>()).add(new Dog());
}
public GenericsTest(List<Animal> list) {
myList = list;
}
public void add(Animal a) {
myList.add(a);
}
public interface Animal {}
public static class Dog implements Animal {}
public static class Cat implements Animal {}
}
Работает нормально. Но, как вы знаете, вы не можете построить это с
new GenericsTest(new ArrayList<Dog>());
потому что, как вы знаете, add (Animal) позволит добавить Cat
s. предлагаемый способ решения этой проблемы, то есть подстановочные знаки тоже не работают, потому что, да, вы можете изменить каждый List<Animal>
в List<? extends Animal>
, но у него та же проблема: вы можете создать GenericsTest
с List<Cat>
и затем добавьте Dog
с.
Итак, мой вопрос: есть ли удобный способ написать этот класс один раз, а затем использовать его для всех возможных Animals
? Конечно, это должно прямо решить вышеупомянутую проблему.