Как реализовать интерфейс с перечислением, где интерфейс расширяет 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> { ... }
Ответ 2
Enum уже реализует сопоставимый, поэтому вы не можете его переопределить.
Общий ответ на why-would-an-enum-implement-an-interface.
Ответ 3
Фактически вы получите ошибку:
Интерфейс Comparable не может быть реализован более одного раза с помощью разные аргументы: Comparable<FooImpl>
и Comparable<Foo>
Поскольку enum FooImpl
уже реализует Comparable<FooImpl>
неявно, вы не можете переопределить его снова как Comparable<Foo>.