Angelika Langer Enum <e extends =“”enum <e =“”>&gt;解码</E>

时间:2013-08-26 19:45:17

标签: java generics

根据我的Previous Question,我正在阅读Angelika Dissecting Enum中的文章。除了类型只能为其子类型实例化并且子类型继承了一些常用方法的点之外,我无法理解该文章。

  1. 以这种方式声明的抽象Enum类是什么意思?它有什么用?
  2. 最后一部分的文件描述了三个方面,有人可以用更简单的方式向我解释吗?
  3. 我确实在代码草图中看到Enum类正在声明compareTo方法。当Enum隐含地实现Comparable interface时。为什么需要定义自己的compareTo方法?
  4. 似乎它是递归泛型的概念。递归泛型究竟意味着什么?在做了一些R&amp; D并理解我的上一个问题答案之后,我明白它会迫使课程自行参数化。
  5. 尽管如此,详细解释仍然有用。

2 个答案:

答案 0 :(得分:1)

我认为将泛型类型声明为Type<E extends Type<E>>的主要好处是,这些泛型类将使子类继承返回或接受具有子类型类型的参数的方法。 java.lang.Enum中的此类方法是:

public final int compareTo( E o) { ... }
public final Class< E > getDeclaringClass() { ... }

因此,如果我们声明枚举Color,则隐含地表示:

public class Color extends Enum<Color>

所以在Enum的实例化中,类型参数E被赋予类型参数Color,因此上述方法将如下所示:

public final int compareTo(Color o) { ... }
public final Class<Color> getDeclaringClass() { ... }

答案 1 :(得分:0)

在说Enum<Color extends Enum<Color>>之类的内容时,听起来就像是在声明一个泛型类型参数Color,以确保它扩展Enum类型参数匹配Color

但这不是声明类的泛型类型参数的地方。您必须在类名旁边声明它们;您只能在extends子句中稍后使用它们。 E.g。

//                Use "extends" here  ...                   not here.
public class MyClass<E extends MyClass<E>> extends MySuperClass<E>

在此示例中,您声明 Color是已在Enum上定义的泛型类型参数的值。