Переопределение контракта метода в расширенном интерфейсе, который использует дженерики (Java)? - PullRequest
3 голосов
/ 18 октября 2010

Я пытаюсь переопределить объявление метода в интерфейсе, который расширяет другой интерфейс. Оба этих интерфейса используют дженерики. Согласно учебным пособиям по Java, это должно быть возможно, но в примере не используются универсальные шаблоны. Когда я пытаюсь реализовать это, компилятор показывает следующую ошибку (я заменил имена, потому что часть кода не принадлежит мне):

myMethod (T) в InterfaceExtended конфликтует с myMethod (T) в интерфейсе; оба метода имеют одинаковое стирание, но ни один не отменяет другой.

Код выглядит так:

public interface Interface<T>
{
public void myMethod(T x);
}

public interface ExtendedInterface<T> extends Interface<T>
{
public void myMethod(T x);
}

Если у кого-то есть предложения относительно того, как это изменить, чтобы сделать его приемлемым, или объяснение причины, по которой это вызывает проблему, я буду очень признателен.

Спасибо!

badPanda

Ответы [ 2 ]

4 голосов
/ 18 октября 2010

Хотите перегруженную версию myMethod? Тогда вам не следует использовать T дважды, но вот так:

public interface Interface<T>
{
  public void myMethod(T x);
}

public interface ExtendedInterface<T, V> extends Interface<T>
{
  public void myMethod(V x);
}

Теперь можно получить что-то вроде этого:

class MyClass implements ExtendedInterface<String, Integer> {
  public void myMethod(String x) { .. }
  public void myMethod(Integer x) { .. }
}

Редактировать: достаточно интересно, это также работает (хотя это бесполезно):

class MyClass implements ExtendedInterface<String, String> {
  public void myMethod(String x) { .. }
}
1 голос
/ 18 октября 2010

Это работает. У вас может возникнуть проблема, если ваш класс реализует дважды один и тот же интерфейс с двумя различными типами обобщенных типов.

Например:

class MyClass implements Interface<String>, ExtendedInteface<Integer>{
}

Например, этот код не работает только в третьем классе.

А вот сообщение, которое я имею на IntelliJ X: alt text

...