Java: Обобщения обрабатываются по-разному в Eclipse и Javac - PullRequest
3 голосов
/ 09 ноября 2010

Скажем, у нас есть класс

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.

1 Ответ

4 голосов
/ 09 ноября 2010

часть этого уже объяснена в вопросе Где Eclipse находит javac для компиляции проекта? - Eclipse использует другой компилятор

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...