Un'istanza di HashMap<String, String>
partite Map<String, ?>
ma non Map<String, Object>
. Dire che si desidera scrivere un metodo che accetta le mappe da String
s a qualsiasi cosa: Se volete scrivere
public void foobar(Map<String, Object> ms) {
...
}
non si può fornire una HashMap<String, String>
. Se scrivi
public void foobar(Map<String, ?> ms) {
...
}
funziona!
Una cosa a volte fraintesa nei generici di Java è che List<String>
non è un sottotipo di List<Object>
. (Ma String[]
è in realtà un sottotipo di Object[]
, questo è uno dei motivi per cui i generici e gli array non si combinano bene (gli array in Java sono covarianti, i generici no, sono invarianti)).
Esempio: Se vuoi scrivere un metodo che accetta List
s di InputStream
s e sottotipi di InputStream
, devi scrivere
public void foobar(List<? extends InputStream> ms) {
...
}
A proposito: Joshua Bloch's Effective Java è una risorsa eccellente quando si Mi piacerebbe capire le cose non così semplici in Java. (La tua domanda di cui sopra è anche trattata molto bene nel libro.)
fonte
2009-03-24 19:19:59
Vedere il tutorial ufficiale su [Wildcards] (http://java.sun.com/docs/books/tutorial/extra/generics/wildcards.html). Lo spiega bene e fornisce un esempio del perché è necessario semplicemente usando Object. –