Как реализовать интерфейс с перечислением, где интерфейс расширяется Comparable? - PullRequest
11 голосов
/ 23 августа 2011

Рассмотрим этот код:

public interface Foo extends Comparable<Foo> {}

public enum FooImpl implements Foo {}

Из-за ограничений типа стирания я получаю следующую ошибку:

java.lang.Comparable не может наследоваться с другими аргументами: <Foo> и <FooImpl>

У меня есть следующие требования:

  • FooImpl должно быть перечислением, потому что мне нужно использовать его в качестве значения по умолчанию в аннотациях.
  • Контракт моего интерфейса заключается в том, что он должен быть сопоставимым.

Я уже пытался использовать общие границы в интерфейсе, но это не поддерживается в Java.

Ответы [ 3 ]

12 голосов
/ 23 августа 2011

Перечисления реализуют Comparable, поэтому FooImpl в итоге дважды расширяет Comparable с несовместимыми аргументами.

Будет работать следующее:

public interface Foo<SelfType extends Foo<SelfType>> extends Comparable<SelfType> { ... }

public enum FooImpl implements Foo<FooImpl> { ... }
12 голосов
/ 23 августа 2011

Enum уже реализует сопоставимый , поэтому вы не можете его переопределить.

Общий ответ относительно почему-бы-en-enum-Imple-an-interface .

1 голос
/ 16 ноября 2013

На самом деле вы получите ошибку:

Интерфейс Comparable не может быть реализован более одного раза с разными аргументами: Comparable<FooImpl> и Comparable<Foo>

Asenum FooImpl уже неявно реализует Comparable<FooImpl>, вы не можете переопределить его снова как Comparable<Foo>.

...