2015-12-09 2 views
0

Q. почему первый из них не работает, но второй работает нормально.?Java Generic (Список <T> list1) VS (List <? Super SuperClass> list2)

1 
public List<? extends Animal> doAdd(List<? extends Animal> list) { 
    //here unable to add, compilation error 
    list.add(new Cat()); 
    return list; 
} 

2 
private static <T> List<T> doAdd(List<T> list){ 
    //working fine. 
    ls.add((T) new Cat()); 
    return ls; 
} 
List<Animal> list = new ArrayList<Aninal>(); 
doAdd(list); 

ответ

0

? extends Sometype не позволяет добавлять ничего, кроме null. ? extends Sometype - это позволить нам ссылаться на подтип.

Давайте возьмем пример

List<? extends Animal> list = new ArrayList<Dog>(); // this assignment works because of ? extends Animal and Dog is a subtype of Animal 

list.add(new Cat()); // this will give a compiler error 

, но предположим, если добавить() работает, вы могли бы добавить Cat в список Dog, которые лишили бы идею компиляции проверки времени, что дженерики provide.That почему ? extends Sometype препятствует вам добавить что-нибудь другое, чем null

Во втором случае вам нужен бросок, потому что сам метод не знает, что T бы, так ls.add((T) new Cat()); потерпит неудачу без броска.

вы можете обновить второе определение метода, чтобы позволить add() работать без приведения в действие.

private static List<? super Animal> doAdd(List<? super Animal> list){ 

     list.add(new Cat()); 
     return list; 
    } 
+0

во втором случае он позволяет добавлять, но все равно нужно использовать/использовать переменную ref класса super во время извлечения. так почему бы не в первом случае разрешить add()? – user13090

+0

@ user13090 '? extends Type' не позволяет добавлять ничего, кроме 'null', с'? Тип типа Type type будет 'Object' – Ramanlfc