Я получаю следующее сообщение об ошибке (сокращено до важной части) при компиляции моих классов:
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
имеет тип ImmutableSortedMap<E, ?>
иОпределение неизменяемых классов выглядит следующим образом:
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> {
...
}
Ошибка появляется, когда я компилирую с использованием сценария ANT или вручную, но не в Eclipse.Я пробовал это с sun 1.6.0 и icedtea6 1.8.1 .
Есть ли что-то очевидное, что мне не хватает, или есть опция, которая может быть где-то установленав затмении разрешить компиляцию?Дело в том, что прямо сейчас я могу запустить тесты в затмении, но не могу скомпилировать проект вне затмения.
РЕДАКТИРОВАТЬ: ответ
Кажется, что некоторые версии компилятора имеют проблемы с множественным наследованием, как это.Решение состоит в том, чтобы переопределить метод еще раз в подклассе, наследуя от других интерфейсов, которые имеют общий суперинтерфейс и которые переопределяют сами метод.
public interface ImmutableSortedMap<K, V>
extends ImmutableMap<K, V>, SortedMap<K, V> {
// adding this method solves the problem
@Override
public ImmutableSet<K> keySet();
}
Кстати, это и есть Diamonпроблема.