2013-08-26 33 views
0

按照我的Previous Question,我正在阅读Angelika Dissecting Enum的文章。除了类型只能为其子类型实例化并且子类型继承一些常用方法之外,我无法理解文章。Angelika Langer Enum <E extends Enum <E>>解码

  1. 以这种方式声明的抽象Enum类是什么意思?它有什么用处?
  2. 最后一部分的文档描述了三个方面,有人可以更容易地向我解释它们吗?
  3. 我在代码草图中看到Enum类正在声明compareTo方法。当Enum暗含实现Comparable interface时。为什么需要定义自己的compareTo方法?
  4. 似乎它是一个递归泛型的概念。递归泛型究竟意味着什么?在做了一些R & D并理解了我的最后一个问题答案之后,我明白它迫使这个类本身被参数化。

尽管如此,详细的解释将是有用的。

+0

“为什么不说它像...” - 因为这是无效的Java;) –

+0

老实说,我的重点不是那个。我知道它不是有效的Java。我的观点是理解整个概念@OliCharlesworth – benz

+2

在C++中,这个习语被称为[奇怪的循环模板模式](http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)。另请参阅以下页面以获取对Java的引用:http://en.wikipedia.org/wiki/Talk:Curiously_recurring_template_pattern – nosid

回答

0

如果说像Enum<Color extends Enum<Color>>,这听起来像你宣称可以确保它扩展Enum与一类参数匹配Color泛型类型参数Color

但是,这并不是声明一个类的泛型类型参数的地方。你必须在类名旁边声明它们;您只能在extends条款中稍后使用它们。例如。

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

在这个例子中,你正在声明Color类是指被上Enum已经定义的通用类型参数的值。

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类型paramater E分配的类型参数Color,所以上面的方法看起来是这样的:

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

谢谢@Katona,我在彻底阅读后明白了这个概念。非常感谢你。我仍然在寻找第2点和第4点的澄清。 – benz

+0

如果您声明为“班级类型' – newacct

相关问题