类型参数为E的子类的泛型E

时间:2019-04-17 09:52:45

标签: java generics

我对Java中的泛型概念还比较陌生,我无法分辨这两个答案之间的区别。

眼前的问题是:
假设我们有一个通用类E,并且我们希望E的类型参数是E的子类。换句话说,只有在类E<F>F或继承自E的情况下,我们才允许E

我将选择范围缩小到可能的范围。

1. class E<T extends E>
2. class E<T extends E<T>>.

我认为选项1符合该问题的规范。 但是我对选项2感到困惑,它实际上扩展了什么。

1 个答案:

答案 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