我如何做泛型泛型?

Joh*_*ith 2 java generics generic-list generic-programming

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{}
Run Code Online (Sandbox Code Playgroud)

错误

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
Run Code Online (Sandbox Code Playgroud)

但LinkedList <Dad>是LinkedList的子类型<?扩展Person>

这应该怎么样?

rge*_*man 6

即使LinkedList<Dad>是子类型LinkedList<? extends Person>,a LinkedList<LinkedList<Dad>>也不是子类型LinkedList<LinkedList<? extends Person>>,出于同样的原因,a List<Dog>不是子类型List<Animal>- Java的泛型是不变的.在这种情况下,它们在每个级别都是不变的,不仅在? extends Person级别而且在LinkedList<? extends Person>级别上.

LinkedList在方法的第一级泛型中添加另一个通配符test.

//                                  vvvvvvvvv
private static void test(LinkedList<? extends LinkedList<? extends Person>> listOfLists){
Run Code Online (Sandbox Code Playgroud)

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

private static void test(List<? extends List<? extends Person>> listOfLists){
    for(List<? extends Person> list : listOfLists){
Run Code Online (Sandbox Code Playgroud)