1

私はこれをしたいと思います(最小限の再現):

String key = "foo";
Object value = new Bar();

if (target instanceof Map<?,?>) {
    Map<?,?> map = (Map<?,?>)target;
    map.put(key, value);
    ...

しかし、私はこう言われました:

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

ここでは String と Object の両方が問題ないようです。私の質問には 2 つの部分があります: (1) なぜですか? そして(2)どうすればこのようなものを作ることができますか?

4

3 に答える 3

1

Map <?,?>は、実際にはMap <?オブジェクトを拡張しますか?extends Object> Java型システムによると、?に特化した型パラメーターの値のみを取得できます。メソッド呼び出しからワイルドカードを拡張します。メソッドに渡すことはできません。

PSおそらくあなたはMap<Object、Object>が欲しいでしょう

于 2012-07-16T21:15:44.740 に答える
1

問題は、無制限のワイルドカードを使用するコレクションでは、要素を追加できないことです。もしそうなら、コレクションをキャストしてより具体的な型パラメーターを持つことができ、ジェネリックが提供するはずの型安全性が突然失われます。

Map<?,?> map = (Map<?,?>)target;
map.put(key, value);  // Not actually allowed
Map<String, String> evilMap = (Map<String, String>)map;
String barAsString = evilMap.get(key); // But it's actually a Bar!
于 2012-07-16T21:05:20.107 に答える
0

このブログ投稿は答えを提供します。Map<?, ?>つまり、コンパイラはが本当に a なのMap<String, Object>か、たとえばa なのかわからないMap<Integer, Double>ため、型の安全性を保証できません。

于 2012-07-16T21:10:15.767 に答える