2 votes

Génériques Java et types bornés

J'ai une classe enveloppante pour ConcurrentMap comme suit :

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

La ligne marquée déclenche l'erreur de compilation suivante :

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

Je pense que les caractères génériques non délimités sont la cause du problème, mais je ne peux pas modifier la signature de la méthode puisqu'elle est héritée de l'interface ConcurrentMap. Avez-vous une idée ?

0voto

0voto

Orest V Points 71

Regardons la signature de putAll

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

... et à l'erreur que vous avez obtenue :

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

La raison pour laquelle vous ne pouvez pas le faire, c'est la restriction de la fusion de l'arbre d'héritage en Java.

Il sera probablement préférable d'écrire votre propre implémentation de la méthode putAll.

Merci, j'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X