No, non è di sola lettura ... anche se in genere è l'intenzione.
Dato un oggetto List<? extends Number>
, il compilatore converts il suo tipo su List<X>
dove X è un sottotipo sconosciuto di Numero. Pertanto, l'oggetto ha un metodo add(X)
. Possiamo chiamare il metodo con un argomento X
... ad esempio, null
.
E poiché get()
rendimenti X
, potremmo anche chiamare add()
con un valore da get()
.... Direttamente invocando list.add(list.get(i))
non funziona, anche se ha un senso. Avremo bisogno di un po 'di helper.
L'esempio classico è Collections.reverse(List<? extends Object> list)
. Questo metodo modificherà lo list
, nonostante il carattere jolly.
È inoltre possibile chiamare i metodi di modifica come clear()
, ovviamente in qualsiasi elenco.
Detto, jolly è infatti principalmente per uso loco variance, e più spesso, esso trasmette l'intenzione da parte del progettista API se un tipo di parametro è destinato in o fuori. Ad esempio, dichiarando List<? super/extends Foo>
, l'API esprime che intende immettere in oppure ottenere T di, l'elenco.
È un equivoco che il jolly effettui la lettura/la sola scrittura. Ma questo malinteso funziona nella maggior parte dei casi d'uso. E più persone che hanno questa idea sbagliata, più diventa una convenzione ...
vedere il mio articolo sul jolly - http://bayou.io/draft/Capturing_Wildcards.html
Non so, nota che nums.add ((Numero) new Double (3.14)); genera l'errore: Il metodo add (cattura n. 1 di? estende Numero) nel tipo Lista non è applicabile per gli argomenti (numero) –
Vedere questa domanda: http://stackoverflow.com/questions/2723397/java-generics-what-is-pecs – Natix
questo è un malinteso molto comune; ma la concezione funziona nella maggior parte dei casi :) – ZhongYu