繁体   English   中英

Java泛型的泛型

[英]Java generics of generics of

我有一个表示文本片段的泛型类。 该文本片段可以具有许多不同模式中的任何一种(不同类型的突出显示)。 这些模式由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;
    ...

我收到以下错误:

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

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

E extends Enum<E>

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

---------------------编辑-------------------

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

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

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

由于Java继承的困难,你需要反过来写:

public class TextFragment<E extends Enum<E> & TextFragmentMode<E>> {

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

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

public class TextFragment<E extends Enum<E>, M extends TextFragmentMode<E>>

现在你有一个不同类型的参数表示的每个约束,他们都有道理-你一定能找到一个E这是一个枚举,和M这是一个TextFragmentMode<E> 但是,这很复杂......

......你肯定需要它是这个通用? 你在课堂上和M做什么? 你能不能只将TextFragmentMode<E>作为构造函数参数(或其他),并在一个类型参数中再次使用它?

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

public class TextFragment<T extends Enum<T>, E extends TextFragmentMode<T>> {

没有测试,我猜:

public class TextFragment<E extends TextFragmentMode<E>> {

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM