2009-12-17 24 views
10

Ho un metodo che restituisce un map definito come:problema usando la mappa generico con jolly

public Map<String, ?> getData(); 

L'attuale implementazione di questo metodo non è chiaro per me, ma, quando cerco di fare:

obj.getData().put("key","value") 

ottengo seguente messaggio di errore in fase di compilazione: (? String, cattura # 9-of)

Il metodo put nel tipo Mappa non è applicabile per gli argomenti (String, String)

Qual è il problema? String non di tipo qualcosa?

Grazie in anticipo.

+0

grazie per le risposte .. sono impressionato dalla velocità con cui hai reagito ... molte grazie – mmoossen

risposta

9

Il jolly significa "il parametro di tipo di valore potrebbe essere qualsiasi cosa" - è non significa "è possibile utilizzare questo come se fosse qualche cosa che voglio che sia ". In altre parole, un Map<String, UUID> è valido come Map<String, ?> - ma non si vorrebbe poter inserire un valore String in esso.

Se si desidera una mappa che può sicuramente accettare i valori di stringa, si vuole:

Map<String, ? super String> 
+4

La classe stringa è definitiva, quindi solo la nybon

-2

[EDIT] Questo è veramente sbagliato ... ho capito.

La mia prima risposta è stata:

Questo è java: String non è un oggetto.

Prova con

obj.getData().put("key",new String("value")); 

Ma String estende Object ... mentre pensavo String era un primitivo. Ho imparato qualcosa ^^

+3

Una stringa certamente * è * un oggetto. Quale differenza precisa credete che farebbe chiamare esplicitamente il costruttore String in questo caso? –

+0

La stringa non è un tipo primitivo, vero? – enguerran

+0

No, non è un tipo primitivo ... quindi perché hai affermato che non è un oggetto? –

0

Prova questa:

public Map<String, Object> getData(); 
14

Il tipo di ritorno di

Map<String, ?> 

è lo stesso di

Map<String, ? extends Object> 

I mezzi che il tipo di calcestruzzo restituito potrebbe essere un Map<String, AnyClass>. Non è possibile inserire un String in un AnyClass, quindi l'errore.

Un buon principio generale è quello di non utilizzare i caratteri jolly nei metodi restituiti.

3

Map<String, ?> è una forma abbreviata di Map<String,? extends Object> e non significa che qualsiasi cosa possa essere aggiunta come valore. Dice che l'oggetto Map può avere qualsiasi tipo di valore generico che si estende Object.

Ciò significa che l'oggetto Map può essere un HashMap<String, String> o un HashMap<String, Integer> pure. Poiché il compilatore non può controllare quali tipi di valore saranno accettati, non ti permetterà di chiamare metodi con il tipo di valore come parametro.

Nota:

  • È possibile chiamare i metodi con il tipo di valore come valore di ritorno, perché tutto deve estendersi Object (? Estende Object)
  • Un Map<String, ? super String> avrà l'effetto opposto: È sempre possibile utilizzare una stringa come parametro, ma il tipo di ritorno non è chiaro.
Problemi correlati