2013-04-24 1 views
7

Stavo leggendo i java generics, ho trovato un'interessante query. La mia domanda è la seguente.Java Generics per le wildcard bound bound e lower bound

  1. Per un jolly limitato superiore

    public static void printList(List<? extends Number> list) { 
        for (int i = 0; i < 10; i++) { 
         list.add(i);// gives compilation error 
        } 
    } 
    
  2. Per un jolly limitato inferiore

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

Sono confuso con questo, perché guardando la documentazione Sun di Oracle Capisco che il codice dovrebbe essere compilato anche per il punto 1

Upper Bound Wildcard Lower Bound Wildcard

Qualcuno può per favore mi aiuti a capire questo?

+0

@baraky: grazie per il link mi è mancato in qualche modo .. ma la domanda è perché non viene compilata quando il tipo generico sa che deve essere una classe estesa per Numero. Ci scusiamo per la domanda ridondante. Non è ancora chiaro per me. – chaosguru

risposta

7

Questo perché quando si utilizza limite superiore, non è possibile aggiungere elementi alla raccolta, solo leggerli.

questo significa che questi sono alcuni dei compiti di legge:

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

quindi non si può garantire che quando si aggiunge oggetto, si terrà corretti tipi di oggetti. per un'esplosione migliore, seguire: How can I add to List<? extends Number> data structures?

1

in realtà, fortunatamente lo stesso scenario, ho ottenuto la risposta nelle prossime pagine della documentazione Sun Oracle. si prega di trovare il link qui sotto. può essere utile a qualcuno che cercherebbe in futuro.

Wildcard Capture