【问题标题】:How do I do generic generics?我如何做泛型泛型?
【发布时间】:2016-03-25 22:46:44
【问题描述】:
import java.util.LinkedList;
class GenericInseption{
  public static void main(String[] args){
    LinkedList<LinkedList<Dad>> listOfLists = new LinkedList<>();
    LinkedList<Dad> list = new LinkedList<>();
    listOfLists.add(list);
    test(listOfLists);//error
  }
  private static void test(LinkedList<LinkedList<? extends Person>> listOfLists){
    for(LinkedList<? extends Person> list : listOfLists){
      for(Person person : list){
        //peform operation on person objects
      }
    }
  }
}
class Person{}
class Dad extends Person{}

错误

GenericInseption.java:7: error: method test in class GenericInseption cannot be applied to given types;
    test(listOfLists);//error
    ^
  required: LinkedList<LinkedList<? extends Person>>
  found: LinkedList<LinkedList<Dad>>
  reason: argument mismatch; LinkedList<LinkedList<Dad>> cannot be converted to LinkedList<LinkedList<? extends Person>>
1 error

但 LinkedList 是 LinkedList

这应该如何工作?

【问题讨论】:

  • 需要LinkedList&lt;? extends LinkedList&lt;? extends Person&gt;&gt;
  • 谢谢你,路易斯这似乎工作
  • 或者只是List&lt;? extends List&lt;? extends Person&gt;&gt;
  • 是的,保罗,我知道我没有在方法中使用任何 LinkedList 的特殊成员,它可能只是 List
  • 每个人一开始都会遇到困难。 Java 泛型可能太复杂了。这是我不久前问的一个类似问题。 stackoverflow.com/q/27465348/3973077

标签: java generics generic-programming generic-list


【解决方案1】:

即使LinkedList&lt;Dad&gt;LinkedList&lt;? extends Person&gt; 的子类型,LinkedList&lt;LinkedList&lt;Dad&gt;&gt; 也不是LinkedList&lt;LinkedList&lt;? extends Person&gt;&gt; 的子类型,原因与List&lt;Dog&gt; 不是List&lt;Animal&gt; 的子类型相同——Java 的泛型是不变的。在这种情况下,它们在每个级别都是不变的,不仅在 ? extends Person 级别,而且在 LinkedList&lt;? extends Person&gt; 级别。

test方法的第一级泛型的LinkedList前面添加另一个通配符。

//                                  vvvvvvvvv
private static void test(LinkedList<? extends LinkedList<? extends Person>> listOfLists){

或者,为了更广泛地适用,使用List 而不是LinkedList

private static void test(List<? extends List<? extends Person>> listOfLists){
    for(List<? extends Person> list : listOfLists){

【讨论】:

  • 是的,我认为我现在明白了,因为泛型中的子类型不同于普通的子类型
猜你喜欢
  • 2022-10-15
  • 1970-01-01
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多