我有一个泛型类,它表示文本的片段。该文本片段可能具有若干不同模式(不同类型的突出显示)中的任意一种。这些模式由Enum表示。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>代码的一部分。有人知道我做错了什么吗?我肯定遗漏了一些关于泛型的东西..。
我终于花时间阅读了乔希·布洛赫(第二版)的“有效Java”(第二版),结果发现他把这个用例作为项目34:用接口来模拟可扩展枚举。尽管我想说的是伟大的思想一样.那就太冒昧了!
发布于 2010-11-22 17:48:40
TextFragment<E>需要说两件关于E的事情。
它“扩展”TextFragmentMode<E>.
Enum<E>.由于Java继承的艰巨性,您需要用相反的方式编写:
public class TextFragment<E extends Enum<E> & TextFragmentMode<E>> {发布于 2010-11-22 17:28:51
问题是,您试图使E扩展TextFragmentMode和Enum,它们不是相关类型。什么类型的E将满足这两种约束?
我怀疑您需要两个类型参数,如下所示:
public class TextFragment<E extends Enum<E>, M extends TextFragmentMode<E>>现在,每个约束都表示在不同的类型参数上,它们都很有意义--您肯定可以找到一个E,它是一个枚举,一个M,它是一个TextFragmentMode<E>。但是这很复杂..。
..。你真的需要它是如此通用吗?你会在课堂上用M做什么?你不能仅仅把一个TextFragmentMode<E>作为构造函数参数(或者其他什么),使它再次在一种类型参数中泛化吗?
发布于 2010-11-22 17:29:36
您需要引入一种新类型,它可以解释Enum的界限。
public class TextFragment<T extends Enum<T>, E extends TextFragmentMode<T>> {https://stackoverflow.com/questions/4248223
复制相似问题