E
枚举中的类型参数定义为<E extends Enum<E>>
.那么为什么在Enum实现源代码中,我们还需要检查getClass()
并getDeclaringClass()
在compareTo
方法中?当我在其中设置不同的枚举类型对象时,我不认为编译器可以通过compareTo
.
它涵盖了比较通过不安全/未经检查的强制转换和转换(例如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()而没有问题.ClassCastException
getDeclaringClass
Enum other = (Enum)o
至于比较getClass
,它被标记为该来源中的"优化".这是一个优化的原因是,如果值类是相同的,那么它们肯定来自相同的枚举,因此没有必要调用稍贵的getDeclaringClass
.由于绝大多数枚举都可能是简单的枚举(没有值类主体),因此针对该情况进行了优化.