Скажем, у нас есть класс
public class Entry<K, V> {
public Entry(K k,V v) {
mKey = k;
mValue = v;
}
public K getKey() {
return mKey;
}
public V getValue() {
return mValue;
}
...
}
Затем мы пишем расширяющий класс, например:
public class ExtendedEntry<K extends SomeSpecificKey, V> extends Entry<K, V>
Затем еще один класс в иерархии:
public class ConcreteEntry<Option extends Something, K extends MoreSpecificKey<Option>, V> extends ExtendedEntry<K, V>
MoreSpecificKey
здесь:
public interface MoreSpecificKey<OptionType extends Something> extends SomeSpecificKey {
public void doSomething(OptionType option);
}
И я использую метод doSomething()
где-то в коде ConcreteEntry
.
Затем компилятор Eclipse говорит «ОК», создает код и не выводит предупреждений.
Но javac
ответов:
... Типы ConcreteEntry.java:6 ... ExtendedEntry и ... ExtendedEntry несовместимы: оба определяют метод getKey (), но несвязанные типы возвращаемых данных
Когда я изменяю (удаляя универсальный тип) MoreSpecificKey
на:
public interface MoreSpecificKey extends SomeSpecificKey {
public <OptionType extends Something> void doSomething(OptionType option);
}
ConcreteEntry
определение сейчас:
public class ConcreteEntry<Option extends Something, K extends MoreSpecificKey, V> extends ExtendedEntry<K, V>
Ошибка в javac
исчезла, и все тоже в порядке.
Итак, в чем причина того, что Eclipse компилирует подобный код - это какой-либо определенный параметр компилятора или другие предпочтения, или различия в компиляторах. Как обработать (исправить) это при разработке в Eclipse и быть уверенным, что он скомпилируется в javac
.