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

но LinkedList < папа> является подтипом LinkedList <? extends Person>

Как это должно работать?

+2

Вы _would_ нужно 'LinkedList > '. –

+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>.

Добавить еще один подстановочный знак перед 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){ 
+0

yes it works I _think_ Я получаю это сейчас, потому что подтипирование в generics отличается от обычного подтипирования –