为什么Java不允许在枚举中重写equals(Object)?

2022-09-01 03:12:59

我注意到以下片段...

@Override
public boolean equals(Object otherObject) {
    ...
}

...不允许使用枚举,因为该方法在枚举中定义。为什么会这样?equals(Object x)final

我想不出任何需要覆盖Enum的用例。我只是好奇地想知道这种行为背后的原因。equals(Object)


答案 1

任何事情都是违反直觉的,并且违反了最小惊讶的原则。当且仅当两个枚举常量是同一对象并且覆盖此行为的能力容易出错时,它们才应是预期的枚举常量。return this == otherequal

相同的推理适用于 、 、 、 和 。hashCode()clone()compareTo(Object)name()ordinal()getDeclaringClass()


JLS并没有激励选择使其成为最终的,但在这里的枚举上下文中提到平等。片段:

Enum 中的 equals 方法是一个最终方法,它仅在其参数上调用 super.equals 并返回结果,从而执行标识比较。


答案 2

已经提供了一个强烈的直观概念,即a的实例(值)相等意味着什么。允许重载方法将导致违反该概念,从而导致意外行为,错误等。enumequals