Как реализовать интерфейс с перечислением, где интерфейс расширяется Comparable?

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

public interface Foo extends Comparable<Foo> {}

public enum FooImpl implements Foo {}

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

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

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

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

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

3 ответа

Решение

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

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

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

public enum FooImpl implements Foo<FooImpl> { ... }

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

Общий ответ относительно того, почему-бы-не-перечислить-реализовать-интерфейс.

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

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

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

Другие вопросы по тегам