Enum中的类型参数E
定义为<E extends Enum<E>>
。那么为什么在Enum实施源[{3}}中,我们仍然需要在getClass()
方法中检查getDeclaringClass()
和compareTo
?当我在compareTo
中设置不同的枚举类型对象时,我认为编译器无法通过。
答案 0 :(得分:7)
它涵盖了比较原始类型和values obtained via unsafe / unchecked casts and conversions(例如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);
}
在那里,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};