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.我越来越倾向于相信这里的正确答案是"如果你移除递归部分,没有什么会改变" - 但我简直无法相信.
我相信这样做的一个令人信服的理由是它使 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 元素上调用这些方法,并且这些调用将是类型安全的。