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>