你如何处理java中的“超级”泛型?

时间:2008-10-21 23:17:26

标签: java generics

采用以下泛型示例

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?当然它应该直接解决上述问题。

2 个答案:

答案 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 {}