这种Java泛型范例的作用是什么?它叫什么?

时间:2010-03-04 21:40:50

标签: java generics inheritance

我正在查看一些具有以下形式的Java类:


public 
abstract
class A <E extends A<E>> implements Comparable <E> {

   public final int compareTo( E other ) {
      //  etc
   }   
}

public 
class B extends A <B> {
   // etc
}

public 
class C extends A <C> {
   // etc
}


我在这里使用“可比较”只是为了说明通用参数“E”的可能用途。泛型/继承的这种用法是否有名称?它用于什么?

我的印象是,这允许抽象类提供方法的常见实现(例如compareTo),而不必在子类中提供它。但是,在此示例中,与继承方法不同,它会限制子类在同一子类的其他实例上调用compareTo,而不是任何“A”子类。听起来不错吗?

无论如何,只是好奇是否有任何大师在此之前已经看过这个并知道它的作用。

谢谢!

3 个答案:

答案 0 :(得分:4)

在C ++中,它被称为Curiously Recurring Template Pattern(CRTP)。我不知道它在Java中是否有不同的名称(或者即使它有一个名称),但它可能用于类似的目的。

答案 1 :(得分:0)

我相信它通常被称为递归通用类型。正如Tom Hawtin指出的那样,你可能想要A类&lt; E延伸A&lt; E&gt;&gt;。这种模式最突出的用途是java.lang.Enum(你可能知道你选择Comparable&lt; E&gt;作为你的界面)。

答案 2 :(得分:0)

它没有名称,通常没用。编写它的人可能没有意识到他们可以这样写它:

class A<E> implements Comparable<E>
  

我的印象是,这允许抽象类提供   没有的方法的常见实现(如compareTo)   在子类中提供它。

不超过class A<E>

  

但是,在此示例中,与继承的方法不同,它会限制   用于在其他实例上调用compareTo的子类   子类,而不是任何“A”子类。听起来不错吗?

不,那是不对的。它限制它在compareTo上调用E,无论E是什么。