2016-03-25 57 views
2
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 

但鏈表<爸爸>是鏈表<的子類型?延伸人>

這應該如何工作?

+2

您_would_需要'LinkedList的<?擴展LinkedList <?擴展Person >>'。 –

+0

謝謝路易斯,這似乎工作 –

+2

或只是'列表<?擴展List <?擴展人>> –

回答

6

即使LinkedList<Dad>LinkedList<? extends Person>一個亞型,一個LinkedList<LinkedList<Dad>>不是LinkedList<LinkedList<? extends Person>>一個亞型,出於同樣的原因,一個List<Dog>不是List<Animal>亞型 - Java的泛型是不變的。在這種情況下,它們在每個級別不變,不僅在? extends Person級別,而且在LinkedList<? extends Person>級別。

test方法的第一級仿製藥中添加另一個通配符LinkedList

//         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){ 
+0

是的,它的工作原理我_think_我現在明白了,因爲泛型中的子類型與正常的子類型不同 –