2012-08-30 7 views
5

dato questo frammento di codicePerché l'aggiunta di una sottoclasse di tipo in una raccolta è illegale?

//Creates a list of List numbers 
    List<List<Number>> num = new ArrayList<List<Number>>(); 
    //Creates a list of List doubles 
    List<List<Double>> doub = new ArrayList<List<Double>>(); 
    //List of doubles 
    List<Double> d = new ArrayList<Double>(); 
    d.add(2.5); 
    d.add(2.6); 
    doub.add(d); 

    num.add(d);//This code will not compile 

Perché non sarà consentito che num.add (dop)? non è List<List<Number>> un super tipo di List<List<Double>>?

+1

Intendevi num.add (d) invece di num.add (dubbio)? – Alex

+0

I tipi generici devono essere esatti a meno che non sia consentito? estende i sottotipi o '? super 'super tipi. –

+0

Ho modificato il codice. Intendeva 'num.add (d)', altrimenti la domanda non è interessante! – romaintaz

risposta

6

Generics inheritance è poco diverso dalla nostra comprensione dell'eredità. Se si desidera utilizzare i tipi di sottoclasse, è necessario definire i limiti (wildcards) utilizzando extends (o) super in generici.

enter image description here

+0

puoi fornirmi un esempio per quanto riguarda il mio esempio? – KyelJmD

+0

+1 Ho aggiunto un'immagine alla tua risposta per essere più chiara –

+0

così farò questo? Elenco ? – KyelJmD

1

si sta cercando di aggiungere una lista di liste a una lista che prende una lista. (Non dopo modifica vedo)

O forse un po 'meno confusione:

Your num list can only add List<Number>, you are trying to add a List<List<Double>>. 

Inoltre, l'eredità con i generici non funziona in questo modo, anche se avete aggiunto un elenco di doppi, non sarebbe lavoro.

Se si definisce num in questo modo:

List<List<? extends Number>> num = new ArrayList<List<? extends Number>>(); 

allora si sarà in grado di fare questo:

num.add(d); 

ma non:

num.add(doub); 
0

List<Double> non ha nulla a che fare con List<Number> per quanto riguarda il compilatore riguardo allo List<> parte.

Pertanto, List<List<Double>> non eredita da List<List<Number>> sono due tipi completamente diversi dal sistema Java Generics. Questa non è una relazione extends come quando si costruiscono classi.

0

Dati i tipi dichiarati, doub.add(d) e num.add(doub) implicano un comportamento incoerente di add(). Se doub.add(d) funziona, non mi aspetterei nemmeno num.add(doub).

Forse forse significa per testare

num.add(d) 

invece di

num.add(doub) 

?

Problemi correlati