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

ata*_*mur 14 java generics enums

请参阅 Java Enum定义为什么在java enum中声明为Enum <E extends Enum <E >> 进行一般性讨论.如果Enum类被定义为,我想知道究竟会破坏什么(不再是类型安全,或者需要额外的强制转换等)

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

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

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> {}
Run Code Online (Sandbox Code Playgroud)

有了它,我无法在这个确切的情况下找到任何好处.

PS.我不被允许做的事实

class ThirdEnum extends MyEnum<SecondEnum> {}
Run Code Online (Sandbox Code Playgroud)

当使用递归定义MyEnum时
a)不相关,因为使用真实的枚举你不能仅仅因为你不能自己扩展枚举
b)不是真的 - 请在编译器中尝试它并看到它实际上是能够编译没有任何错误

PPS.我越来越倾向于相信这里的正确答案是"如果你移除递归部分,没有什么会改变" - 但我简直无法相信.

Jea*_*nal 2

我相信这样做的一个令人信服的理由是它使 MyEnum 类中的代码更加类型安全。

考虑一下递归部分使这样的事情成为可能:

class MyEnum<E extends MyEnum<E>> {
    private Thing<E> util1() { return someObject }
    private void util2(E e) {}
    public int method(E o) { 
        Thing<E> thingy = o.util1(); 
        // You can call the util1 method on o and get a type safe return element.
        E o1 = // I don't care how you get a parametrized E object.
        o.util2(o1);
        // You can call the util2 method with a typesafe parameter.
    }
}
Run Code Online (Sandbox Code Playgroud)

简而言之,这种递归性允许您将类型安全的方法放入 Enum 类中,您可以在任何 E 元素上调用这些方法,并且这些调用将是类型安全的。

  • http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Enum.java Enum 类本身使用该方法作为 `getDeclaringClass` 方法(依次在“compareTo”方法中使用)。 (2认同)