【发布时间】:2010-03-30 01:27:24
【问题描述】:
我在一个不相关的问题上看到了一些代码,但这让我很好奇,因为我从未见过 Java 泛型的这种构造。创建一个可以作为类型参数本身或其后代的泛型类有什么用。这是示例:
abstract class A<E extends A<E>> {
abstract void foo(E x);
}
首先想到的是一个以列表为参数的列表。使用这段代码感觉很奇怪,你如何声明一个类型为 A 的变量?递归声明!?
这还有效吗?如果是这样,你们中有人在代码中看到了吗?它是如何使用的?
编辑
事实上,我的问题与this one 相同,只是措辞不同,但该问题的答案也会回答我的问题。
也感谢您对Curiously Recurring Template Pattern 的引用,它提供了一些历史背景和对该主题的进一步解释。
这个老 blog entry 可能给出了我为我们 Java 人找到的最好的全面解释。
现在很难在这里选择正确的答案,因为它们都很有帮助,所以我会选择最终产生最多阅读材料的那个(参考上文)
【问题讨论】:
-
实际上应该是
abstractg class A<E extends A<E>> {。使用A需要一个通用参数(否则它是“原始的”,混合原始类型和熟类型是一个坏主意)。这里真正的问题是该类使用通用参数的命名约定,我觉得这非常令人困惑。 -
@Tom:谢谢,是的,在阅读了这个主题并理解了这种模式的使用之后,我意识到了错误。我已经更正了上面的代码以反映这一点。