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>> {