17

map次のように定義されたを返すメソッドがあります。

public Map<String, ?> getData();

このメソッドの実際の実装は明確ではありませんが、実行しようとすると:

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

次のコンパイル時エラー メッセージが表示されます。

Map 型の put(String, capture#9-of ?) メソッドは、引数 (String, String) には適用されません。

何が問題ですか?タイプのものではStringありませんか?

前もって感謝します。

4

5 に答える 5

18

の戻り型

Map<String, ?>

と同じです

Map<String, ? extends Object>

返される具体的な型がMap<String, AnyClass>. Stringaを に入れることはできないAnyClassため、エラーが発生します。

一般的な原則として、メソッドの戻り値の型にワイルドカードを使用しないことをお勧めします。

于 2009-12-17T11:56:41.787 に答える
13

ワイルドカードは、「値の型のパラメーターは何でもかまいません」という意味です。これは、「これを好きなように使用できる」という意味ではありません。言い換えれば、aMap<String, UUID>は - として有効ですがMap<String, ?>、String 値をそれに入れたいとは思わないでしょう。

文字列値を確実に受け入れることができるマップが必要な場合は、次のようにします。

Map<String, ? super String>
于 2009-12-17T11:55:06.503 に答える
6

Map<String, ?>の短縮形でMap<String,? extends Object>あり、何でも値として追加できるという意味ではありません。Map-object は、任意の汎用値型 extends を持つことができると言われていますObject

これは、Map オブジェクトがHashMap<String, String>または である可能性があることを意味しHashMap<String, Integer>ます。コンパイラはどの値の型が受け入れられるかを確認できないため、値の型をパラメーターとして使用してメソッドを呼び出すことはできません。

ノート:

  • すべてが Object を拡張する必要があるため (? extends Object)、値の型を戻り値としてメソッドを呼び出すことができます。
  • AMap<String, ? super String>には逆の効果があります。いつでも文字列をパラメーターとして使用できますが、戻り値の型は不明です。
于 2009-12-17T13:50:20.123 に答える
0

これを試して:

public Map<String, Object> getData();
于 2009-12-17T11:54:51.760 に答える
-2

[編集]これは本当に間違っています...わかりました。

私の最初の答えは:

それは Java です。文字列はオブジェクトではありません。

試してみてください

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

しかし、String は Object を拡張します... String はプリミティブだと思っていましたが、なんとなく勉強になりました^^

于 2009-12-17T11:54:18.923 に答える