采用以下泛型示例
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
。 建议解决此问题的方法,即通配符也不起作用,因为,是的,您可以更改List<Animal>
中的每个List<? extends Animal>
,但它有同样的问题:您可以使用GenericsTest
创建List<Cat>
,然后添加Dog
s。
所以我的问题是:有没有一种方便的方法来编写这个类一次,然后将其用于所有可能的Animals
?当然它应该直接解决上述问题。
答案 0 :(得分:6)
如果我理解你要做的事情,那么你需要将泛型类型放在类级别:
public class GenericsTest<T extends Animal>
{
private List<T> myList;
public static void main(String args[])
{
new GenericsTest<Dog>(new ArrayList<Dog>());
}
public GenericsTest(List<T> list)
{
myList = list;
}
public void add(T a)
{
myList.add(a);
}
}
答案 1 :(得分:2)
您可能希望将整个类设为通用,而不仅仅是参数:
import java.util.List;
import java.util.ArrayList;
public class GenericsTest<T extends Animal> {
private final List<T> myList;
public static void main(final String args[]) {
new GenericsTest<Animal>(new ArrayList<Animal>()).add(new Dog());
new GenericsTest<Dog>(new ArrayList<Dog>()).add(new Dog());
new GenericsTest<Cat>(new ArrayList<Cat>()).add(new Cat());
}
public GenericsTest(final List<T> list) {
myList = list;
}
public void add(final T a) {
myList.add(a);
}
}
// Can't nest as Animal needs to be in scope of class declaration
interface Animal {}
class Dog implements Animal {}
class Cat implements Animal {}