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

Dav*_*ide 5 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 {}
}
Run Code Online (Sandbox Code Playgroud)

它工作正常.但是如你所知,你不能用它构建它

new GenericsTest(new ArrayList<Dog>());
Run Code Online (Sandbox Code Playgroud)

因为,如你所知,add(Animal)可以添加Cats.该建议解决这个问题的方法,即使用通配符也不管用,因为,是的,你可以改变每一个List<Animal>List<? extends Animal>却有着同样的问题:你可以创建GenericsTestList<Cat>再添加Dog秒.

所以我的问题是:有没有一种方便的方法来编写这个类一次,然后将它用于所有可能的Animals?当然它应该直接解决上述问题.

Gre*_*man 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);
  }
}
Run Code Online (Sandbox Code Playgroud)