【问题标题】:How to implement an interface with an enum, where the interface extends Comparable?如何用枚举实现一个接口,该接口扩展了 Comparable?
【发布时间】:2011-08-23 12:23:38
【问题描述】:

考虑这段代码:

public interface Foo extends Comparable<Foo> {}

public enum FooImpl implements Foo {}

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

java.lang.Comparable 不能用不同的参数继承:&lt;Foo&gt;&lt;FooImpl&gt;

我有以下要求:

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

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

【问题讨论】:

  • 试试public interface Foopublic enum FooImpl implements Foo, Comparable&lt;FooImpl&gt; {...}
  • 问题是FooImpl已经实现了Comparable&lt;FooImpl&gt;
  • 而您只是想证明它确实如此?写在评论中。
  • 我需要能够将Role 的实例视为Comparable,此处的评论无济于事。
  • 就在public enum...上方,添加://Note: implements Comparable.

标签: java generics interface enums comparable


【解决方案1】:

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

以下将起作用:

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

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

【讨论】:

  • public interface Foo&lt;SelfType&gt; extends Comparable&lt;SelfType&gt; 就足够了
【解决方案2】:

枚举已经实现了comparable,所以你不能覆盖它。

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

【讨论】:

  • 你在回避这个问题。如果是另一个接口呢。
  • @aioobe 嗯?问题询问如何实现扩展可比较的接口
  • 如果我想通过我的接口引用我的枚举对象:(Interface Foo {...} Enum1 implements Foo {...} Foo x1 = Enum1.FIRST;) 并且如果我还需要在需要Comparable 的上下文中使用它,那么我必须声明Foo extends Comparable&lt;??something??&gt;。如果没有在@jvdnese 的答案中输入(诚然笨拙),您就不能让两个不同的枚举实现 Foo 并让编译器知道 Foos 是 Comparable。 (这只是一个警告,所以你可以跳过implements Comparable就可以了)。带有警告的示例是 TreeSet&lt;Foo&gt; x = new TreeSet&lt;&gt;();
【解决方案3】:

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

接口 Comparable 不能被多次实现 不同的论点 :Comparable&lt;FooImpl&gt;Comparable&lt;Foo&gt;

由于枚举FooImpl 已经隐式实现Comparable&lt;FooImpl&gt;,您不能再次将其覆盖为Comparable&lt;Foo&gt;.

【讨论】:

    猜你喜欢
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多