2

I have a wrapper class for ConcurrentMap like the following:

public MapWrapper<K, V> implements ConcurrentMap<K, V> {

    private final ConcurrentMap<K, V> wrappedMap;

    ...
    @Override
    public void putAll(Map<? extends K, ? extends V> map) {
        wrappedMap.putAll(map);  // <--- Gives compilation error
    }
    ...
}

The marked line triggers the following compilation error:

method putAll in interface java.util.Map<K,V> cannot be applied to given types;
required: java.util.Map<? extends capture#5 of ? extends K,? extends capture#6 of ?
    extends V>
found: java.util.Map<capture#7 of ? extends K,capture#8 of ? extends V>
reason: actual argument java.util.Map<capture#7 of ? extends K,capture#8 of ? extends V> 
    cannot be converted to java.util.Map<? extends capture#5 of ? extends K,? extends 
    capture#6 of ? extends V> by method invocation conversion

I suspect the unbounded wildcards are the culprit but I can't change the method signature since it is inherited from the ConcurrentMap interface. Any ideas?

4

2 に答える 2

0

あなたは見ましたか:

バインドされたワイルドカードと型パラメーターの違いは何ですか?

于 2011-06-04T21:13:21.363 に答える
0

putAll の署名を見てみましょう

public void putAll(Map<? extends K, ? extends V> m)

...そしてあなたが得たエラーへ:

cannot be converted to java.util.Map<? extends capture#5 of ? extends K,? extends 

できない理由は、Java の継承ツリーのマージの制限です。

おそらく、putAll メソッドの独自の実装を作成する方がよいでしょう。

ありがとう、それがあなたを助けることを願っています。

于 2012-03-31T19:39:44.493 に答える