Java 嵌套列表中的泛型类型和通配符

Java 嵌套列表中的泛型类型和通配符,java,list,generics,wildcard,Java,List,Generics,Wildcard,我正在尝试编写一个方法,该方法将列表的任何列表作为参数,而不考虑嵌套列表的类型。 对于采用任何类型的单个列表的方法,通配符类型可以正常工作(请参见示例1)。但这一概念并没有扩展到列表列表。如例2所示,该方法只接受List>类型的参数。这是为什么?我如何编写一个同时接受List-list2; 示例1(列表1);//有效的 例1(列表2);//有效的 列表1; 列出对我有效的: List<List<Integer>> listOfLists1; List<List<

我正在尝试编写一个方法,该方法将列表的任何列表作为参数,而不考虑嵌套列表的类型。
对于采用任何类型的单个列表的方法,通配符类型可以正常工作(请参见示例1)。但这一概念并没有扩展到列表列表。如例2所示,该方法只接受
List>
类型的参数。这是为什么?我如何编写一个同时接受
List-list2;
示例1(列表1);//有效的
例1(列表2);//有效的
列表1;
列出对我有效的:

List<List<Integer>> listOfLists1;
List<List<?>> listOfLists2;

public TestKlasse() {
    init();
}

public void init(){
    listOfLists1 = new ArrayList();
    listOfLists2 = new ArrayList();
    listOfLists1.add(Arrays.asList(1,2,3,4,5));
    listOfLists2.add(Arrays.asList("a","a",2,4,"5"));
    test((Collection)listOfLists1);
    test((Collection)listOfLists2);
}

private void test(Collection<Collection<?>> list){
    list.forEach(e -> {
        System.out.println(e.toString());
    });
}
我希望此解决方案符合您的期望。

适合我的解决方案:

List<List<Integer>> listOfLists1;
List<List<?>> listOfLists2;

public TestKlasse() {
    init();
}

public void init(){
    listOfLists1 = new ArrayList();
    listOfLists2 = new ArrayList();
    listOfLists1.add(Arrays.asList(1,2,3,4,5));
    listOfLists2.add(Arrays.asList("a","a",2,4,"5"));
    test((Collection)listOfLists1);
    test((Collection)listOfLists2);
}

private void test(Collection<Collection<?>> list){
    list.forEach(e -> {
        System.out.println(e.toString());
    });
}

我希望此解决方案符合您的期望。

示例2
不起作用,因为
列表
不是
列表
的子类型,类似于
列表
不是
列表
的子类型,即使
字符串
对象
的子类型。基本上,当类型不是由通配符直接参数化时,类型参数必须完全匹配--
List
List
不完全匹配。(里面有一个通配符,但它是具体类型
列表的一部分,而不是顶层的通配符。)

为了能够接受不同的类型参数,它需要在顶层有一个通配符:

public void example4(List<? extends List<?>> listOfLists) {}
public void示例4(列表>列表列表){}

示例2
不起作用,因为
列表
不是
列表
的子类型,类似于
列表
不是
列表
的子类型,即使
字符串
对象
的子类型。基本上,当类型不是由通配符直接参数化时,类型参数必须完全匹配--
List
List
不完全匹配。(里面有一个通配符,但它是具体类型
列表的一部分,而不是顶层的通配符。)

为了能够接受不同的类型参数,它需要在顶层有一个通配符:

public void example4(List<? extends List<?>> listOfLists) {}
public void示例4(列表>列表列表){}
这里稍微讨论一下这个问题。长话短说,对于
example2
,您只需使用
List>
,同样地
List在这里稍微讨论一下这个问题。长话短说,对于
example2
和同样的
List,您只需使用
List>