我正在查看一些具有以下形式的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”子类。听起来不错吗?
无论如何,只是好奇是否有任何大师在此之前已经看过这个并知道它的作用。
谢谢!
答案 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
是什么。