我试图编写一个方法,它将任何列表List作为参数 - 不管嵌套列表的类型如何。
对于采用任何类型的单个列表的方法,通配符类型可以正常工作(请参阅example1)。但是这个概念并没有扩展到列表清单。如在示例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<?> listOfLists) {}
public void example2(List<List<?>> listOfLists) {}
public <T> void example3(List<List<T>> listOfLists) {}
[这个问题](https://stackoverflow.com/questions/12861726/why-cant-you-have-a-listliststring-in-java)略微越过这里的问题。长话短说,你只需要使用'List <?扩展列表>>'为'example2'和同样'List <? 'example3'扩展列表 extends T>>。泛型可能非常挑剔。 – Obicere