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

时间:2017-02-25 23:12:54

标签: java enums

Enum中的类型参数E定义为<E extends Enum<E>>。那么为什么在Enum实施源[{3}}中,我们仍然需要在getClass()方法中检查getDeclaringClass()compareTo?当我在compareTo中设置不同的枚举类型对象时,我认为编译器无法通过。

2 个答案:

答案 0 :(得分:7)

它涵盖了比较原始类型和values obtained via unsafe / unchecked casts and conversions(例如ComparableObject 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);
}

在那里,compareTo会因显式ClassCastException比较getDeclaringClass而失败,因为它会通过第一次显式转换(Enum other = (Enum)o)而没有任何问题。

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

答案 1 :(得分:4)

如果您使用Enum作为原始类型,则可以。例如,在这个程序中:

public static void main(String[] args) {
    Enum e = A.x; // All occurrences of E are erased to Enum
    e.compareTo(B.i); // B.i extends Enum, so this is fine
}   

enum A {x,y,z};
enum B {i,j,k};