使用递归类型边界

6 java extends

我的一个朋友在Java API中找到了这个小问题(https://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html),

Class Enum<E extends Enum<E>>
Run Code Online (Sandbox Code Playgroud)

并阅读以下文章https://docs.oracle.com/javase/tutorial/java/generics/genTypes.html我可以理解上述行在语法上的含义,但从给出的例子中我无法弄清楚用例这超出了Enum类(查看来源).

我想更多地了解上述可能存在解决方案的问题.

zap*_*apl 7

例如,允许子类使用自己的类型很有用

想象一下这样的课程

class Node {
    Node next;
}
Run Code Online (Sandbox Code Playgroud)

如果你扩展那个课程,你就会坚持下去Node.

class SpecialNode extends Node {
    void foo() {
        // euwww
        SpecialNode nextNode = (SpecialNode) this.next;
    }
}
Run Code Online (Sandbox Code Playgroud)

你也不能像它一样定义它

class Node<T> {
    T next;
}
Run Code Online (Sandbox Code Playgroud)

因为这样就可以了T.你真的想要一个Textends Node或可以不再使用T作为Node从内Node而无需进行转换.但它适用于儿童班.

通过使用递归边界

class Node<T extends Node<T>> {
    T next;
}
Run Code Online (Sandbox Code Playgroud)

您将T限制为自己或您自己的子类,然后允许您这样做

class SpecialNode extends Node<SpecialNode> {
    void foo() {
        SpecialNode nextNode = this.next; // type-safe!
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,父类和子类都可以在其抽象级别上访问完全类型安全的所有内容.