3

ここに私のコードスニペットがあります:

Map<String, ? extends Object> data = this.aub.getData();
//... some code ...
data.put("ip_macs", new LinkedList<Object>()); //gets error

マークされた行で発生するエラーは次のとおりです (メッセージは Eclipse IDE から取得されます)。

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

誰かがその理由を知っていますか?LinkedListが のサブタイプである限りObject、エラーが出る理由はないと思います。この問題のどこを誤解していますか?

4

1 に答える 1

10

ジェネリック型を次のように指定します

Map<String, Object> data = this.aub.getData();
data.put("ip_macs", new LinkedList<Object>()); // Compiles

あなたが言うときMap<String, ? extends Object>Mapそのキーは型Stringで、値は拡張しますがObject、その型は不明 ?です。タイプが不明であるため、LinkedListそこにオブジェクトを挿入するのは安全ではありません。

基本的に、コンパイラはこれを防ごうとしています:

Map<String, String> mapOfStrings = new HashMap<String, String>();
mapOfStrings.add("string", "value");

Map<String, ? extends Object> map = mapOfStrings; // Compiles
map.add("string", 1); // ERROR!

これが許可されている場合は、ジェネリックによって提供される型の安全性を回避したことになります。

于 2013-08-26T08:08:03.657 に答える