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

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

public interface Foo extends Comparable<Foo> {}

public enum FooImpl implements Foo {}

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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 3

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

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

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