【发布时间】:2017-10-18 16:41:14
【问题描述】:
我正在尝试编写一个将任何列表列表作为参数的方法 - 无论嵌套列表的类型如何。
对于采用任何类型的单个列表的方法,通配符类型可以正常工作(参见示例 1)。但是这个概念并没有扩展到列表列表。从示例 2 中可以看出,该方法只接受 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) {}
【问题讨论】:
-
This question 稍微讨论了这里的问题。长话短说,你只需要使用
List<? extends List<?>>来代替example2,同样地使用List<? extends List<? extends T>>来代替example3。泛型真的很挑剔。
标签: java list generics wildcard