首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泛型的Java泛型

泛型的Java泛型
EN

Stack Overflow用户
提问于 2010-11-22 17:23:42
回答 4查看 14.3K关注 0票数 15

我有一个泛型类,它表示文本的片段。该文本片段可能具有若干不同模式(不同类型的突出显示)中的任意一种。这些模式由Enum表示。Enum对于每个项目来说可能是不同的,但是它必须实现一个接口,该接口提供了将其中两个项目组合在一起的方法(可以高亮显示和粗体显示)。所以我有一个界面:

代码语言:javascript
复制
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既是一个文本字符串的容器,也是一个模式的容器。但是当我试图声明这个类的时候:

代码语言:javascript
复制
public class TextFragment<E extends TextFragmentMode<E extends Enum<E>>> {
    StringBuilder text;
    E mode;
    ...

我得到以下错误:

令牌“扩展”上的

语法错误,预期

根据eclipse语法高亮显示,它指的是

代码语言:javascript
复制
E extends Enum<E>

代码的一部分。有人知道我做错了什么吗?我肯定遗漏了一些关于泛型的东西..。

我终于花时间阅读了乔希·布洛赫(第二版)的“有效Java”(第二版),结果发现他把这个用例作为项目34:用接口来模拟可扩展枚举。尽管我想说的是伟大的思想一样.那就太冒昧了!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-22 17:48:40

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

它“扩展”TextFragmentMode<E>.

  • In命令的
  • 命令,您还必须约束它以扩展Enum<E>.

由于Java继承的艰巨性,您需要用相反的方式编写:

代码语言:javascript
复制
public class TextFragment<E extends Enum<E> & TextFragmentMode<E>> {
票数 16
EN

Stack Overflow用户

发布于 2010-11-22 17:28:51

问题是,您试图使E扩展TextFragmentModeEnum,它们不是相关类型。什么类型的E将满足这两种约束?

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

代码语言:javascript
复制
public class TextFragment<E extends Enum<E>, M extends TextFragmentMode<E>>

现在,每个约束都表示在不同的类型参数上,它们都很有意义--您肯定可以找到一个E,它是一个枚举,一个M,它是一个TextFragmentMode<E>。但是这很复杂..。

..。你真的需要它是如此通用吗?你会在课堂上用M做什么?你不能仅仅把一个TextFragmentMode<E>作为构造函数参数(或者其他什么),使它再次在一种类型参数中泛化吗?

票数 7
EN

Stack Overflow用户

发布于 2010-11-22 17:29:36

您需要引入一种新类型,它可以解释Enum的界限。

代码语言:javascript
复制
public class TextFragment<T extends Enum<T>, E extends TextFragmentMode<T>> {
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4248223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档