2010-03-04 66 views
7

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

 

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

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

无论如何,只是好奇,如果任何专家在那里看到这个,并知道它做了什么。

谢谢!

回答

4

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

+0

该维基页面基本上是我正在寻找的解释,谢谢!我发现关于编译时“静态”多态的说明颇为有趣。 – Tom 2010-03-04 23:20:43

+1

这里有一个很好的面向Java的讨论:http://madbean.com/2004/mb2004-3/寻找标题“更多技巧与类型参数” – 2010-03-30 19:47:24

+0

网址[应该被包括在一个答案只作进一步阅读](http://meta.stackexchange.com/q/8259)。这个答案似乎严重依赖于URL的内容,并且可以从答案中包含的网址摘要中受益。 – 2013-12-28 09:00:06

0

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

+0

不,你不会。你应该使用'A '。 – newacct 2013-12-29 00:18:28

0

它没有名称,通常没有用。大概谁写它的人并没有意识到,他们可以写这样的而不是:

class A<E> implements Comparable<E> 

我的印象是,这使得抽象类提供的方法的 常见的实现(如的compareTo)而不需要 在子类中提供它。

不任何超过class A<E>

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

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