如何实现具有枚举的接口,其中接口扩展为Comparable?

时间:2011-08-23 12:23:39

标签: java generics interface enums comparable

考虑以下代码:

public interface Foo extends Comparable<Foo> {}

public enum FooImpl implements Foo {}

由于类型擦除的限制,我收到以下错误:

  

java.lang.Comparable不能使用不同的参数继承:<Foo><FooImpl>

我有以下要求:

  • FooImpl需要是枚举,因为我需要将其用作注释中的默认值。
  • 我的界面合同是它需要具有可比性。

我已经尝试在界面中使用泛型边界,但Java不支持这种方式。

3 个答案:

答案 0 :(得分:12)

枚举已实施comparable,因此您无法覆盖它。

关于why-would-an-enum-implement-an-interface的一般答案。

答案 1 :(得分:12)

Enums实现Comparable,因此FooImpl最终会使用不兼容的参数扩展Comparable两次。

以下内容可行:

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

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

答案 2 :(得分:1)

实际上你会得到的错误是:

  

接口Comparable不能多次实现   不同的论点   :Comparable<FooImpl>Comparable<Foo>

由于枚举FooImpl已经隐式实施Comparable<FooImpl>,因此无法再将其覆盖为Comparable<Foo>.