Java泛型的泛型


问题内容

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

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项“使用接口模拟可扩展枚举”中介绍
了该用例。就像我想说的一样,好主意也是如此……这太冒昧了!


问题答案:

TextFragment<E>需要说两点E

  • 它“扩展” TextFragmentMode<E>
  • 为了做到这一点,您还必须限制它的extend Enum<E>

由于Java继承的不确定性,您需要用另一种方式编写:

public class TextFragment<E extends Enum<E> & TextFragmentMode<E>> {