繁体   English   中英

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

[英]How do you deal with “super” generics in java?

采用以下泛型示例

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<? extends Animal>每个List<Animal> List<? extends Animal> List<? extends Animal>但它有同样的问题:您可以使用List<Cat>创建GenericsTest ,然后添加Dog s。

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

如果我理解你要做什么,那么你需要将泛型类型放在类级别:

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);
  }
}

您可能希望将整个类设为通用而不仅仅是参数:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM