java - 嵌套列表中的通用类型和通配符

标签 java list generics wildcard

我正在尝试编写一个方法,该方法将任何列表列表作为参数 - 无论嵌套列表的类型如何。
对于采用任何类型的单个列表的方法,通配符类型可以正常工作(请参见示例 1)。但这个概念并没有扩展到列表的列表。从 example2 中可以看出,该方法只接受 List<List<?>> 类型的参数。但不是特定类型,例如 List<List<Integer>> 。示例 3 使用类型参数 T并接受List<List<Integer>>但不再接受List<List<?>> 。这是为什么?我怎样才能编写一个接受 List<List<?>> 的方法?和List<List<Integer>>

public void test()
{
    List<Integer> list1;
    List<?> list2;
    
    example1(list1); // Valid
    example1(list2); // Valid
    
    List<List<Integer>> listOfLists1;
    List<List<?>> listOfLists2;
    
    example2(listOfLists1); // Error
    example2(listOfLists2); // Valid
    
    example3(listOfLists1); // Valid
    example3(listOfLists2); // Error
}

public void example1(List<?> list) {}

public void example2(List<List<?>> listOfLists) {}

public <T> void example3(List<List<T>> listOfLists) {}

最佳答案

example2不起作用,因为 List<List<Integer>>不是 List<List<?>> 的子类型即使List<Integer>List<?> 的子类型,类似于 List<String>不是 List<Object> 的子类型即使StringObject 的子类型。基本上,当类型不直接由通配符参数化时,类型参数必须完全匹配 -- List<Integer>List<?>不完全匹配。 (里面有一个通配符,但它是具体类型 List<?> 的一部分,而不是顶层的通配符。)

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

public void example4(List<? extends List<?>> listOfLists) {}

关于java - 嵌套列表中的通用类型和通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46815175/

相关文章:

java - 使用 shell 脚本写入程序的标准输入

c# - 如何将此 EF Mock 设置代码编写为可重用的通用样板?

java - 如何获取对当前类实例的编译时引用

generics - 如何定义匿名泛型 Scala 函数?

java - 在java中创建唯一值的列表

python - 如何删除列表中的负号?

java - 如何将数据从不同的类添加到Arraylist

Java Google Plus 通过 oAuth 2.0 访问

java - 使用 service/dao 层模式的 Android 项目 "back-end"的最佳架构

python - 如果大小增加,为什么 python 列表的位置没有改变?