我对Java中的泛型概念还比较陌生,我无法分辨这两个答案之间的区别。
眼前的问题是:
假设我们有一个通用类E,并且我们希望E
的类型参数是E
的子类。换句话说,只有在类E<F>
是F
或继承自E
的情况下,我们才允许E
。
我将选择范围缩小到可能的范围。
1. class E<T extends E>
2. class E<T extends E<T>>.
我认为选项1符合该问题的规范。 但是我对选项2感到困惑,它实际上扩展了什么。
答案 0 :(得分:3)
好吧,选项1实际上使用的是原始类型。
您将E
定义为具有参数T
,因此E
是参数化类型。如果您定义T
以扩展E
,则还必须指定E
的类型参数,否则E
是原始类型。
所以唯一的“有效” 1 选项是选项2:
class E<T extends E<T>>
Enum
类是递归类型参数的众所周知的示例。参见https://askubuntu.com/q/65911。
1 从技术上讲,第一个选项在语法上正确的意义上也是有效的。但是原始类型仅用于向后兼容。新代码应该从不包含原始类型。另请参见Java Enum definition。