【问题标题】:Why are two enums incompatible with == operator?为什么两个枚举与 == 运算符不兼容?
【发布时间】:2018-10-27 15:25:46
【问题描述】:

我有一个问题:我不知道我不能用 == 运算符比较两个不同的枚举。这是我的代码:

public class EnumExercises {

enum Seasons{
    SPRING, WINTER;

    Seasons() {
        System.out.println("Hello");
    }
}

enum TestResult {
    PASS, FAIL, SPRING; 
}
public static void main(String[] args) {
    Seasons s = Seasons.WINTER;
    Seasons s2 = Seasons.SPRING;
    TestResult t = TestResult.PASS;
    System.out.println(s2==t);  //incompatible...why?
    System.out.println(s2.equals(t));


}}

非常感谢。

【问题讨论】:

标签: java enums comparison


【解决方案1】:

出于同样的原因你不能说

String s = "1";
int t = 1;

if (s == t) {

s2t 是不同的类型。它们没有可比性。

在后台,枚举类型编译出它们的名称,因此除非它强制转换为兼容类型,否则这不会做你想做的事情。如果你想这样做,你应该使用name()toString()。参见例如this answer

if (s2.name().equals(t.name())) {

一般来说,对象上的== 会检查它们是否引用相同的内存。这似乎不是您要在这里检查的内容。您似乎正在寻找原语的行为(如果值相等,则相等),您不会从像这样的对象比较中得到这些行为。

【讨论】:

    【解决方案2】:

    Enum.Equals() 比较两个枚举的类型和值是否相等。因此,在两种不同类型的 Enum 上使用它是合法的。另一方面,== 运算符比较两个枚举的数值,并且预设它们属于同一类型。您的第一个测试失败,因为 Seasons 和 TestResult 不是同一类型。后一个成功是因为它们都基于 Enum 类型——它们只是不等价的。如果你真的需要,你可以通过两种不同的技术来解决这个问题。

    不过,我会提前建议您谨慎使用它们,因为它们可能会在以后造成各种麻烦。枚举是不同的类型,大概是有原因的。回避这个原因是一个引出“为什么?”的问题。如果您对该问题有一个合理的答案,那么您真正应该关注的是重构您的代码以使其不必要

    现在,对于如何避免比较它们,我承诺了两种方法。首先是价值。将两个枚举都转换为整数并按值比较它们,例如 ((int)s2) == ((int)t);。这与使用运算符 == 基本相同,只是您从比较中删除了类型。第二个是意义 - 通过将它们都转换为字符串来比较枚举本身,因此 s2.ToString().Equals(t.ToString());。这会将“SPRING”与“PASS”进行比较,因此数字等价不再是问题。

    如果应该可以将您的两个枚举相互转换,那么您应该关注的是首先明确地进行转换然后比较它们。这样一来,您的目标就会更加清晰,如果您发现自己试图在几年后维护该代码,这将使您更加快乐。这是更实际的工作,但它会在可读性方面带来好处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 2011-01-28
      • 2022-11-11
      • 1970-01-01
      • 2017-11-14
      相关资源
      最近更新 更多