Luc*_*cas 10 java generics enums
我有一个表示文本片段的泛型类.该文本片段可以具有许多不同模式中的任何一种(不同类型的突出显示).这些模式由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 );
}
Run Code Online (Sandbox Code Playgroud)
然后我的TextFragment是一个文本字符串和一个模式的容器.但是当我尝试宣布这个课时:
public class TextFragment<E extends TextFragmentMode<E extends Enum<E>>> {
StringBuilder text;
E mode;
...
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
令牌"extends"的语法错误,预期
根据eclipse语法突出显示,其中指的是
E extends Enum<E>
Run Code Online (Sandbox Code Playgroud)
部分代码.有谁知道我做错了什么?我一定错过了关于泛型的东西......
---------------------编辑-------------------
我终于花时间阅读Josh Bloch撰写的Effective Java(第二版),结果发现他已经过了这个用例,如第34项:使用接口模拟可扩展的枚举.尽管我想说伟大的思想一样......但这样做太过于pres!
Tom*_*ine 12
TextFragment<E>需要说两件事E.
TextFragmentMode<E>.Enum<E>.由于Java继承的困难,你需要反过来写:
public class TextFragment<E extends Enum<E> & TextFragmentMode<E>> {
Run Code Online (Sandbox Code Playgroud)
问题是,你想使电子延伸TextFragmentMode 和 Enum,这是不相关类型.什么类型E会满足两个约束?
我怀疑你想要两个类型参数,如下所示:
public class TextFragment<E extends Enum<E>, M extends TextFragmentMode<E>>
Run Code Online (Sandbox Code Playgroud)
现在你有一个不同类型参数表示的每个约束,它们都有意义 - 你绝对可以找到E一个枚举,一个M是一个TextFragmentMode<E>.但是,这很复杂......
......你肯定需要它是这个通用?你会M在课堂上做什么?你能不能只把一个TextFragmentMode<E>构造函数参数(或其他)作为一个类型参数再次使用它?
| 归档时间: |
|
| 查看次数: |
10183 次 |
| 最近记录: |