代码之家  ›  专栏  ›  技术社区  ›  Newtopian

在泛型中接受自身作为类型参数有什么用

  •  8
  • Newtopian  · 技术社区  · 15 年前

    我在一个不相关的问题上看到了一些代码,但这让我很好奇,因为我从来没有见过这样的Java泛型构造。创建一个可以作为类型参数本身或其后代的泛型类有什么用呢。以下是示例:

    abstract class A<E extends A<E>> {
        abstract void foo(E x);
    }
    

    首先想到的是一个以列表为参数的列表。使用此代码感觉很奇怪,如何声明a类型的变量?递归声明!?

    这样行吗?如果是这样的话,你们有人在代码中看到过吗?怎么用的?


    编辑

    事实证明,我的问题和 this one

    也谢谢你提到 Curiously Recurring Template Pattern 并对这一问题作了一些历史背景和进一步的解释。

    这么老了 blog entry

    2 回复  |  直到 7 年前
        1
  •  3
  •   Wyzard    15 年前

    泛型不仅仅适用于列表这样的容器。这种“扩展自身”类型参数用于让超类在方法参数和返回类型等位置引用子类,即使在编译超类时没有实际的特定子类可用。它类似于 curiously recurring template pattern 在C++中。

    class Foo extends A<Foo>
    

    以及继承的 foo()

    void foo(Foo x)
    

    看看怎么做 A Foo 参数,即使它实际上不知道

    是的,这种事情是不寻常的,但并非闻所未闻:内置的 Enum

        2
  •  8
  •   Thilo    15 年前

    如果不使用此参数,则该方法的参数 foo 无法绑定到类型 E .

    如果你有一个实现 B 对于这个抽象类,现在可以强制使用该方法 还要求其参数的类型为 B .

     class B extends A<B> {
          void foo (B x){}
     }
    

    任何 有点 A .

    我同意这样做的语法不够优雅。