如果 Enum 声明没有递归部分,Java 中会有什么不同

2022-09-02 10:57:46

请参阅Java Enum定义为什么在java enum中被声明为Enum<E扩展Enum<E>>进行一般性讨论。在这里,我想了解如果Enum类被定义为

public class Enum<E extends Enum> 

我正在使用这段代码来测试我的想法:

interface MyComparable<T> {
    int myCompare(T o);
}

class MyEnum<E extends MyEnum> implements MyComparable<E> {
    public int myCompare(E o) { return -1; }
}

class FirstEnum extends MyEnum<FirstEnum> {}

class SecondEnum extends MyEnum<SecondEnum> {}

有了它,我无法在这种情况下找到任何好处。

PS.我不允许这样做的事实

class ThirdEnum extends MyEnum<SecondEnum> {}

当MyEnum被用递归定义时,a
)不相关,因为对于真正的枚举,你不能这样做,只是因为你不能自己
扩展枚举b)不是真的 - 请在编译器中尝试一下,看看它实际上能够编译没有任何错误

缴费灵。我越来越倾向于相信这里的正确答案是“如果你删除递归部分,什么都不会改变” - 但我就是不敢相信。


答案 1

好吧,首先它会抱怨使用原始类型,但你可以这样做:

public class Enum<E extends Enum<?>>

具有相同的效果。

此外,使用这种类型的泛型,您可以执行如下操作:

class FirstEnum extends MyEnum<SecondEnum> {
}

class SecondEnum extends MyEnum<FirstEnum> {
}

在我看来,这似乎会导致很多麻烦。更确切地说,您不能将FirstEnum类型的枚举与相同类型的枚举进行比较,您必须将其与其他类型的枚举进行比较,如果您要对其进行排序,这真的很麻烦。如果 i 设置为 o,则该示例将无法编译,因为 SecondEnum 不是该类型(这将导致循环继承)。如果(这意味着SecondEnum是FirstEnum的子类 - 正常的分层继承),它将起作用。List<FirstEnum>E?E extends MyEnum<E>FirstEnum extends MyEnum<FirstEnum>


答案 2

考虑。Enum<E>.compareTo(E other)

那:

  • 需要使用 E 而不是枚举,这样您就不会尝试将一个枚举值与来自不同枚举的值进行比较
  • 需要能够通过 Enum 上声明的方法获取枚举的序数值。ordinal()

如果没有当前的约束,您如何建议使其工作?

这只是我想出的第一个...我相信还有很多其他的。基本上,这是一种说法,“你不应该试图将所有枚举视为彼此等价......枚举本身就是一个闭集,但所有枚举都共享某些属性。