我有一个代表文本片段的通用类。该文本片段可能具有多种不同模式(突出显示的不同类型)中的任何一种。这些模式用枚举表示。每个项目的Enum可能不同,但是它必须实现一个接口(interface),该接口(interface)提供了一种方法来组合其中的两个(可以突出显示和加粗显示)。所以我有一个界面:

public interface TextFragmentMode<E extends Enum<E>> {
    /**
     * Will combine the supplied mode with the current mode and return the
     * result.
     *
     * @param mode The mode to combine with.
     * @return The combined mode.
     */
    public E combine( E mode );
}

然后我的TextFragment是文本字符串和模式的容器。但是当我尝试声明该类时:
public class TextFragment<E extends TextFragmentMode<E extends Enum<E>>> {
    StringBuilder text;
    E mode;
    ...

我收到以下错误:



根据eclipse语法高亮显示,它指的是
E extends Enum<E>

代码的一部分。有人知道我在做什么错吗?我一定缺少关于泛型的知识...

- - - - - - - - - - - 编辑 - - - - - - - - - -

我终于花时间阅读Josh Bloch(第二版)的《 Effective Java》,事实证明,他在第34项“使用接口(interface)模拟可扩展枚举”中介绍了该用例。就像我想说的一样,好主意也是如此……这太冒昧了!

最佳答案

TextFragment<E>需要说明有关E的两件事。

  • 它“扩展”了TextFragmentMode<E>
  • 为此,您还必须约束它以扩展Enum<E>

  • 由于Java继承的不确定性,您需要用另一种方式编写:
    public class TextFragment<E extends Enum<E> & TextFragmentMode<E>> {
    

    10-05 17:56