我正在尝试编写一个方法,该方法将任何列表列表作为参数 - 无论嵌套列表的类型如何。
对于采用任何类型的单个列表的方法,通配符类型可以正常工作(请参见示例 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>
的子类型即使String
是 Object
的子类型。基本上,当类型不直接由通配符参数化时,类型参数必须完全匹配 -- List<Integer>
和List<?>
不完全匹配。 (里面有一个通配符,但它是具体类型 List<?>
的一部分,而不是顶层的通配符。)
为了能够接受不同类型的参数,它需要在顶层有一个通配符:
public void example4(List<? extends List<?>> listOfLists) {}
关于java - 嵌套列表中的通用类型和通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46815175/