Дженерики Java и ограниченные типы - PullRequest
2 голосов
/ 05 июня 2011

У меня есть класс-оболочка для ConcurrentMap, например:

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
    }
    ...
}

Отмеченная строка вызывает следующую ошибку компиляции:

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

Я подозреваю, что причиной являются неограниченные символы подстановки, но я не могу изменить сигнатуру метода, поскольку она унаследована от интерфейса ConcurrentMap. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 31 марта 2012

Давайте посмотрим на подпись 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.

Спасибо, надеюсь, это поможет вам.

0 голосов
...