je reçois le message d'erreur suivant (réduite à la partie importante) quand je compiler mes cours:Java erreur de compilation avec des interfaces
reference to keySet is ambiguous, both method keySet() in
java.util.SortedMap<E,capture#614 of ?> and method keySet() in
test.ImmutableMap<E,capture#614 of ?> match
return map.keySet().iterator();
^
map
est de type ImmutableSortedMap<E, ?>
et la définition des classes immuables regards comme:
public interface ImmutableMap<K, V>
extends Map<K, V> {
@Override
public ImmutableSet<K> keySet();
...
}
public interface ImmutableSortedMap<K, V>
extends ImmutableMap<K, V>, SortedMap<K, V> {
...
}
public interface ImmutableSet<E>
extends Set<E> {
...
}
L'erreur apparaît lorsque je compile en utilisant un script ANT ou manuellement, mais pas en éclipse. Je l'ai essayé avec sun 1.6.0 et icedtea6 1.8.1.
Y a-t-il quelque chose d'évident qui me manque ou existe-t-il une option qui peut être définie quelque part dans eclipse pour permettre la compilation? Le truc c'est que, pour l'instant, je peux lancer les tests en eclipse, mais je ne peux pas compiler le projet en dehors d'eclipse.
EDIT: la réponse
Il semble que certaines versions du compilateur ont des problèmes avec l'héritage multiple comme ça. La solution consiste à surcharger la méthode une fois de plus dans la sous-classe héritant d'autres interfaces qui ont une super-interface commune et qui se substituent à la méthode.
public interface ImmutableSortedMap<K, V>
extends ImmutableMap<K, V>, SortedMap<K, V> {
// adding this method solves the problem
@Override
public ImmutableSet<K> keySet();
}
Par ailleurs, c'est le problème de diamon.
Si les méthodes correspondent, alors ce n'est pas un problème. –
Au lieu de changer le nom, la redéclaration de la méthode dans la sous-classe a résolu le problème. – Kru