我有一个代表文本片段的通用类。该文本片段可能具有多种不同模式(突出显示的不同类型)中的任何一种。这些模式用枚举表示。每个项目的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>> {