为什么Java Enum需要在compareTo方法中检查class和declaringClass

wyh*_*o31 3 java enums

E枚举中的类型参数定义为<E extends Enum<E>>.那么为什么在Enum实现源代码中,我们还需要检查getClass()getDeclaringClass()compareTo方法中?当我在其中设置不同的枚举类型对象时,我不认为编译器可以通过compareTo.

Jas*_*n C 7

它涵盖了比较通过不安全/未经检查的强制转换和转换(例如Comparable,或Object a)获得的原始类型和的情况:

static enum Fruit { Apple, Orange, Banana };
static enum Animal { Cat, Dog, Horse };

public static final void main (String[] args) throws Exception {   
    Enum f = Fruit.Apple;
    Enum a = Animal.Cat;
    f.compareTo(a);
}
Run Code Online (Sandbox Code Playgroud)

在那里,在显式比较中compareTo会失败,因为它会传递第一个显式的cast()而没有问题.ClassCastExceptiongetDeclaringClassEnum other = (Enum)o

至于比较getClass,它被标记为该来源中的"优化".这是一个优化的原因是,如果值类是相同的,那么它们肯定来自相同的枚举,因此没有必要调用稍贵的getDeclaringClass.由于绝大多数枚举都可能是简单的枚举(没有值类主体),因此针对该情况进行了优化.