2009-12-17 4 views
10

j'ai une méthode qui renvoie un map défini comme:problème en utilisant la carte générique avec joker

public Map<String, ?> getData(); 

La mise en œuvre effective de cette méthode n'est pas clair pour moi, mais, lorsque je tente de faire:

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

Je reçois suivants compilent message d'erreur de temps: (String, capture # 9 de)

La méthode mis dans le type carte n'est pas applicable pour les arguments (String, String)

Quel est le problème? Est-ce que String ne tapait rien?

Merci d'avance.

+0

merci pour les réponses .. je suis impressionné de la rapidité avec laquelle vous avez réagi ... merci beaucoup – mmoossen

Répondre

9

Le caractère générique signifie « paramètre le type de valeur pourrait être quelque chose » - il ne signifie « vous pouvez l'utiliser comme si elle était tout ce que vous veux qu'il soit ". En d'autres termes, un Map<String, UUID> est valide en tant que Map<String, ?> - mais vous ne voudriez pas pouvoir y mettre une valeur String.

Si vous voulez une carte qui peut certainement accepter les valeurs de chaîne, vous voulez:

Map<String, ? super String> 
+4

La classe de chaîne est finale, donc juste Map nybon

-2

[EDIT] C'est vraiment faux ... J'ai compris.

Ma première réponse a été:

C'est java: String est pas un objet.

Essayez avec

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

Mais cordes extends Object ... alors que je pensais à cordes était une primitive. J'ai appris quelque chose ^^

+3

Une chaîne est certainement * un * objet. Quelle différence précise croyez-vous que cela ferait d'appeler le constructeur String explicitement dans ce cas? –

+0

La chaîne n'est pas un type primitif, n'est-ce pas? – enguerran

+0

Non, ce n'est pas un type primitif ... alors pourquoi avez-vous prétendu que ce n'est pas un objet? –

0

Essayez ceci:

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

Le type de retour de

Map<String, ?> 

est le même que

Map<String, ? extends Object> 

Les moyens que le type de béton renvoyé pourrait être un Map<String, AnyClass>. Vous ne pouvez pas mettre un String dans un AnyClass, d'où l'erreur.

Un bon principe général consiste à ne pas utiliser de caractères génériques dans les types de retour de méthode.

3

Map<String, ?> est une forme courte de Map<String,? extends Object> et ne signifie pas que n'importe quoi peut être ajouté comme valeur. Il est dit que l'objet Map peut avoir n'importe quel type de valeur générique s'étendant Object.Cela signifie que l'objet Map peut également être un HashMap<String, String> ou un HashMap<String, Integer>. Comme le compilateur ne peut pas vérifier quels types de valeurs seront acceptés, il ne vous laissera pas appeler des méthodes avec le type de valeur en tant que paramètre.

Note:

  • Vous pouvez appeler des méthodes avec le type de valeur en tant que valeur de retour, parce que tout doit se prolonger l'objet (? Extends Object)
  • Un Map<String, ? super String> aura l'effet inverse: Vous pouvez toujours utiliser un paramètre String, mais le type de retour n'est pas clair.
Questions connexes