2014-01-09 4 views
3

Я пытаюсь следовать документации оракула для генериков в сборе, для верхних границ и нижних границ, но это создает путаницу .. аJAVA Дженерики Bounds Путаница

import java.util.ArrayList; 
import java.util.List; 

public class Test2 { 

    public static void main(String[] args) { 


     List<Dog> dogList = new ArrayList<>(); 
     dogList.add(new Dog()); 
     dogList.add(new Dog()); 

     List<Cat> catList = new ArrayList<>(); 
     catList.add(new Cat()); 
     catList.add(new Cat()); 

     List<Entity> entList = new ArrayList<>(); 
     entList.add(new Entity()); 
     entList.add(new Entity()); 

     print(dogList); 
     print(catList); 
     print1(entList); 


    } 

    public static void print(List<? extends Animal> animals){ 

     for(Animal an : animals){ 
      System.out.println(an); 
     } 
    } 

    public static void print1(List<? super Animal> animals){ 
     animals.add(new Animal()); 
     animals.add(new Dog()); 
     for(Object an : animals){ 
      System.out.println(an); 
     } 
    } 
} 
class Entity {} 
class Animal extends Entity{} 
class Dog extends Animal {} 
class Cat extends Animal {} 

Теперь путаница, даже переменная имеет тип List<? super Animal>, мне разрешено добавлять новые экземпляры собаки, например, animals.add(new Dog()) ... почему ??? также, если моя переменная имеет тип List<? extends Animal>, это не позволяет мне добавлять экземпляры Animal, или Dog или Entity ... любые причины?

+1

подстановочных символов, является общим – Rugal

ответ

0

List<? super Animal> - это список животных или объектов или любых объектов, поэтому вы можете добавить к нему Собака. Собака - это животное и сущность. Это

List<Object> objList = new ArrayList<>(); 
    objList.add(new Dog()); 
    objList.add(new Animal()); 
    objList.add(new Entity()); 
    objList.add(new Object()); 
    print1(objList); 

компилируется без ошибок или предупреждения

+0

согласился, но почему тогда 'List 'не разрешено добавлять никаких собак или кошек, так как Dog расширяет Animal? – sunilp

+0

Список означает, что это может быть список собак или кошек anysubclass, можете ли вы добавить Dog в список - нет, это может быть список Cats, Cat? не ... –

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