Javagenerics的generics

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

public interface TextFragmentMode<E extends Enum> { /** * 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>> { StringBuilder text; E mode; ... 

我收到以下错误:

令牌“extends”的语法错误,预期

根据eclipse的语法突出显示,其中指的是

 E extends Enum 

部分代码。 有谁知道我做错了什么? 我一定错过了关于generics的东西……

———————编辑——————-

我终于花时间阅读Josh Bloch撰写的Effective Java(第二版),结果发现他将这个用例改为第34项:使用接口模拟可扩展的枚举 。 尽管我想说伟大的思想一样……但那太过分了!

TextFragment需要说两件关于E事情。

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

由于Javainheritance的困难,你需要反过来写:

 public class TextFragment & TextFragmentMode> { 

问题是你正在尝试使E扩展TextFragmentMode Enum ,它们不是相关的类型。 什么类型的E会满足两个约束?

我怀疑你想要两个类型参数,如下所示:

 public class TextFragment, M extends TextFragmentMode> 

现在你有一个不同的类型参数表示的每个约束,它们都有意义 – 你绝对可以找到一个枚举的E和一个TextFragmentModeTextFragmentMode 但是,这很复杂……

…你真的需要它成为通用的吗? 你在课堂上和M一起做什么? 你能不能只将TextFragmentMode作为构造函数参数(或其他),并在一个类型参数中再次使用它?

您需要引入一个考虑Enum界限的新类型

 public class TextFragment, E extends TextFragmentMode> { 

没有测试,我猜:

 public class TextFragment> { 

嗯,简短的测试显示它似乎也不起作用……