12

考虑这段代码:

public interface Foo extends Comparable<Foo> {}

public enum FooImpl implements Foo {}

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

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

我有以下要求:

  • FooImpl需要是一个枚举,因为我需要将它用作注释中的默认值。
  • 我的接口的约定是它需要具有可比性。

我已经尝试在接口中使用泛型边界,但 Java 不支持。

4

3 回答 3

13

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

以下将起作用:

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

public enum FooImpl implements Foo<FooImpl> { ... }
于 2011-08-23T13:36:43.200 回答
12

Enum 已经实现了可比性,因此您无法覆盖它。

关于Why-would-an-en-implement-an-interface的一般答案。

于 2011-08-23T12:28:30.893 回答
1

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

接口 Comparable 不能使用不同的参数多次实现:Comparable<FooImpl>Comparable<Foo>

由于枚举FooImpl已经Comparable<FooImpl>隐式实现,您不能再次覆盖它Comparable<Foo>.

于 2013-11-16T13:12:57.370 回答