2015-05-27 5 views
-2
public class CollectionTestImpl { 

    public static void main(String[] args){ 

     List<Animal> ld1 = new ArrayList<Animal>(); 

     ld1.add(new Dog()); 
     ld1.add(new Cat()); 
     impl.addAnimals(ld1); 
} 

public void addAnimals(List<? super Dog> animals){ 
     for (Animal animal : animals){ // this is not allowed compile error 
      System.out.println(animal.checkUp()); 
     } 
    } 

} 

Почему JVM не скомпилирован для (животных животных: животных) ??? is'nt это логически правильно?Почему JVM не позволяет компилировать?

+0

класс Dog общественного реализующими животные – Harish2k22

+0

общественного класс Cat реализует ANIMAL – Harish2k22

+0

общественного класс слон реализует Animal – Maroun

ответ

4

List<? super Dog> animals представляет собой список, который может быть ссылка на List<Dog>List<Animal>, но и List<Object>, так как все DogAnimal и Object можно рассматривать как надтип Dog.

И из-за возможности animals быть List<Object>

for (Animal animal : animals) 

не может работать, потому что не все объекты должны быть животные.

3

Подумайте, какие типы List ваш addAnimals() способ может занять. Ваши дженерики показывают, что это List от супертип от Dog. Таким образом, это может быть List от Object s!

И, очевидно, поскольку это может быть List<Object>, тогда компилятор не может гарантировать, что все в списке будет Animal.

Смежные вопросы