Generic types and wildcards in nested lists
我正在尝试编写一个方法,它将列表的任何列表作为参数,而不管嵌套列表的类型如何。对于采用任何类型的单个列表的方法,通配符类型工作正常(请参见示例1)。但这个概念并没有扩展到列表列表中。如示例2中所示,该方法只接受>
>
>
>
>
>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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<?> listOfLists) {} public void example2(List<List<?>> listOfLists) {} public <T> void example3(List<List<T>> listOfLists) {} |
>
>
为了让它能够接受不同的类型参数,它需要在顶层有一个通配符:
1 | public void example4(List<? extends List<?>> listOfLists) {} |
这对我很有用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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()); }); } |
结果:
1 2 | [1, 2, 3, 4, 5] [a, a, 2, 4, 5] |
我希望这个解决方案符合您的期望。