2013-04-24 11 views
7

Czytałem generics java, natknąłem się na interesujące zapytanie. Moje pytanie jest następujące.Java Generics dla dzikich kart z górną i dolną granicą

  1. Na górnej ograniczonego zamiennika

    public static void printList(List<? extends Number> list) { 
        for (int i = 0; i < 10; i++) { 
         list.add(i);// gives compilation error 
        } 
    } 
    
  2. za niższą ograniczonego zamiennika

    public static void printList(List<? super Integer> list) { 
        for (int i = 0; i < 10; i++) { 
         list.add(i);// successfully compiles 
        } 
    } 
    

Jestem mylić z tym, ponieważ patrząc na dokumentacji Sun Oracle Rozumiem, że kod powinien się skompilować dla punktu 1, jak również

Upper Bound Wildcard Lower Bound Wildcard

Czy ktoś może mi pomóc to zrozumieć?

+0

@baraky: dziękuję za link, ale jakoś mi to umknęło ... ale wciąż pytanie brzmi: dlaczego nie skompiluje się, gdy typ ogólny wie, że musi to być klasa rozszerzona o Number. Przepraszamy za zbędne pytanie. Wciąż jest dla mnie niejasna. – chaosguru

Odpowiedz

7

To dlatego, kiedy używasz górną granicę, nie można dodać elementy do kolekcji, tylko je przeczytać.

oznacza to, że są to jedne z zadań prawnych:

List<? extends Number> l = new ArrayList<Integer>(); 
List<? extends Number> l = new ArrayList<Double>(); 

więc nie można zagwarantować, że podczas dodawania obiektu, będzie posiadać odpowiednie typy obiektów. dla lepszego wyjaśnienia wykonaj następujące czynności: How can I add to List<? extends Number> data structures?

1

Właściwie, na szczęście w tym samym scenariuszu, otrzymałem odpowiedź pod następnymi stronami dokumentacji Sun Oracle. znajdź poniższy link. może być przydatne dla kogoś, kto będzie szukał w przyszłości.

Wildcard Capture