2012-01-11 15 views
5

だから、私はそれでいくつかの値を持っている地図は、メソッドに渡されている地図の中に置く:は<String, ?>

public String doThis(Map<String, ?> context){ 
..... 
} 

そして、私はこの地図

String abc="123"; 
context.put("newAttr",abc); 
に加えて属性を挿入しようとしています

しかし、私はこのエラーを取得しています:

The method put(String, capture#8-of ?) in the type Map is not applicable for the arguments (String, String)

は、地図の「クローン」することなく、このプットを実行するには、とにかくはありますか?

+0

オブジェクトを格納できるマップを作成しようとしていますか? – Perception

答えて

11

タイプXの値を汎用Mapに入れる場合は、MapMap<String, ? super X>と宣言する必要があります。あなたの例では、Xは、そう、Stringです:

public String doThis(Map<String, ? super String> context){ 
..... 
} 

Map<String, ? super X>は意味:Xまたはすべて、このようなマップがStringを受け入れる準備ができているX.のスーパータイプであるタイプの種類Stringのキーと値を持つマップインスタンスをキーとして使用し、Xインスタンスを値として使用します。

+1

+1ですが、最後の段落には誤植があります。つまり、 'extended'ではなく' super'を意味します。 :-) – ruakh

+0

@ruakh確かに。ありがとう。 –

+0

ニース。ありがとうございました。 – ovaherenow

4

PECS(Producer Extends、Consumer Super)を覚えておいてください。あなたは消費者がいるので、それはextendsになることはできません。

0

驚くべきことに、私たちはできるでしょうこのマップをに変換する方が簡単です。ちょうどこのシンプルな構文で:(Map<String, ObjectOrSth>)unfriendlyMap

// Let's get this weird map. 
HashMap<String, String> mapOrig = new HashMap<String, String>(); 
Map<String, ?> mapQuestion = (Map<String, ?>)mapOrig; 
//mapQuestion.put("key2", "?"); // impossible 

// Convert it to almost anything... 
Map<String, String> mapStr2 = (Map<String, String>)mapQuestion; 
mapStr2.put("key2", "string2"); 
assertThat(mapOrig.get("key2")).isEqualTo("string2"); 
Map<String, Object> mapObj = (Map<String, Object>)mapQuestion; 
mapObj.put("key3", "object"); 
assertThat(mapOrig.get("key3")).isEqualTo("object"); 
関連する問題