import java.util.LinkedList;
class GenericInseption{
public static void main(String[] args){
LinkedList<LinkedList<Dad>> listOfLists = new LinkedList<>();
LinkedList<Dad> list = new LinkedList<>();
listOfLists.add(list);
test(listOfLists);//error
}
private static void test(LinkedList<LinkedList<? extends Person>> listOfLists){
for(LinkedList<? extends Person> list : listOfLists){
for(Person person : list){
//peform operation on person objects
}
}
}
}
class Person{}
class Dad extends Person{}
错误
GenericInseption.java:7: error: method test in class GenericInseption cannot be applied to given types;
test(listOfLists);//error
^
required: LinkedList<LinkedList<? extends Person>>
found: LinkedList<LinkedList<Dad>>
reason: argument mismatch; LinkedList<LinkedList<Dad>> cannot be converted to LinkedList<LinkedList<? extends Person>>
1 error
但是 LinkedList
这应该如何工作?
最佳答案
尽管LinkedList<Dad>
是 LinkedList<? extends Person>
的子类型,一个LinkedList<LinkedList<Dad>>
不是 LinkedList<LinkedList<? extends Person>>
的子类型,出于同样的原因 List<Dog>
不是 List<Animal>
的子类型-- Java 的泛型是不变的。在这种情况下,它们在每个级别都是不变的,而不仅仅是在 ? extends Person
上。但处于LinkedList<? extends Person>
水平级别。
在 LinkedList
前面添加另一个通配符在test
中的第一级泛型中方法。
// vvvvvvvvv
private static void test(LinkedList<? extends LinkedList<? extends Person>> listOfLists){
或者,为了使其更广泛适用,请使用 List
而不是LinkedList
:
private static void test(List<? extends List<? extends Person>> listOfLists){
for(List<? extends Person> list : listOfLists){
关于java - 我如何进行泛型泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36229268/