Как реализовать интерфейс с перечислением, где интерфейс расширяется 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>.