这个Java泛型范例做了什么以及它叫什么?

我正在查看一些具有以下形式的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
}


这里我使用“Comparable”只是为了说明泛型参数“E”的可能用法。 这种泛型/继承的用法是否有名字? 它是干什么用的?

我的印象是这允许抽象类提供方法的一个通用实现(比如compareTo),而不必在子类中提供它。 但是,在本例中,与继承方法不同,它将限制子类在相同子类的其他实例上调用compareTo,而不是任何“A”子类。 这听起来正确吗?

无论如何,只是好奇,如果有任何专家在那里以前见过,并知道它做了什么。

谢谢!


在C ++中,它被称为奇怪的循环模板模式(CRTP)。 我不知道它是否在Java中有不同的名称(或者即使它有一个名称),但它可能用于类似的目的。


我相信它通常被称为递归泛型类型。 正如汤姆霍金指出的,你可能希望A类<E扩展A <E >>。 这种模式最突出的用处是java.lang.Enum(你可能知道考虑到你选择了Comparable <E>作为你的接口)。


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

class A<E> implements Comparable<E>

我的印象是这允许抽象类提供方法的一个通用实现(比如compareTo),而不必在子类中提供它。

不超过class A<E>

但是,在本例中,与继承方法不同,它将限制子类在相同子类的其他实例上调用compareTo,而不是任何“A”子类。 这听起来正确吗?

不,这是不正确的。 它限制它在E上调用compareTo ,无论E是什么。

链接地址: http://www.djcxy.com/p/45149.html

上一篇: What does this Java generics paradigm do and what is it called?

下一篇: TFSBuild/MSBuild and Project Reference vs File Reference