【问题标题】:What does this Java generics paradigm do and what is it called?这个 Java 泛型范式有什么作用,它叫什么?
【发布时间】:2011-01-23 21:14:34
【问题描述】:

我正在查看一些具有以下形式的 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”子类上调用。这听起来对吗?

不管怎样,只是好奇那里有没有大师以前见过这个并知道它的作用。

谢谢!

【问题讨论】:

    标签: java generics inheritance


    【解决方案1】:

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

    【讨论】:

    • 该 wiki 页面基本上包含我正在寻找的解释,谢谢!我发现关于编译时“静态”多态性的注释相当有趣。
    • 这里有一个很好的面向 Java 的讨论:madbean.com/2004/mb2004-3 查找标题“类型参数的更多技巧”
    • 网址should be included in an answer for further reading only。此答案似乎在很大程度上依赖于 URL 的内容,并且将从答案中包含的 URL 的摘要中受益。
    • @Duncan 这就是准确地在这里使用 URL 的方式。您会注意到覆盖文本是“Curiously Recurring Template Pattern”,这是您对这个主题进行研究所需的全部。因此,它不会“严重依赖 URL 的内容”(无论这意味着什么)。这个 SO 答案不适用于 CRTP 教程。也就是说,由于这个答案所做的只是命名模式,我会犹豫是否称其为严格完整。
    • @newacct C++ 模板没有类型安全...请赐教。
    【解决方案2】:

    我相信它通常被称为递归泛型类型。正如 Tom Hawtin 指出的那样,您可能需要 A>。这种模式最突出的用途是 java.lang.Enum(考虑到您选择 Comparable 作为接口,您可能知道它)。

    【讨论】:

    • 不,你不会。你应该只使用class A&lt;E&gt;
    【解决方案3】:

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

    class A<E> implements Comparable<E>
    

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

    不超过class A&lt;E&gt;

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-23
      • 2011-02-20
      • 2018-06-29
      • 1970-01-01
      相关资源
      最近更新 更多