Java 为什么myEnum.ONE不等于myEnum.ONE.toString()?

Java 为什么myEnum.ONE不等于myEnum.ONE.toString()?,java,enums,tostring,Java,Enums,Tostring,我有以下枚举: public enum myEnum { ONE("ONE"), TWO("TWO"); private String name; private myEnum(String name) { this.name = name; } @Override public String toString() { return name; } }; 我的问题是,为什么下面的计算结果为false?

我有以下枚举:

public enum myEnum {
    ONE("ONE"), TWO("TWO");

    private String name;

    private myEnum(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }
};
我的问题是,为什么下面的计算结果为false?我怀疑这与equals()方法的实现有关

是的,这是
equals()
方法。对于
Enum
,它如下所示:

public final boolean equals(Object other) { 
    return this==other;
}
现在您的结果很清楚了:枚举与
toString()
方法的结果不是同一个对象。

是的,它是
equals()
方法。对于
Enum
,它如下所示:

public final boolean equals(Object other) { 
    return this==other;
}

现在,您的结果很清楚了:枚举不是与
toString()
方法的结果相同的对象。

通常,不同类型的对象不被定义为相等的,因为要满足相等契约所要求的对称性,两个类必须相互了解

此外,因为平等必须是可传递的(这也是平等契约的规定),引入你的规则会产生奇怪的后果。考虑:

enum Color {
    green, red, blue;
}

enum Experience {
    green, novice, veteran;
}
应该
颜色.绿色
等于
经验.绿色
?可能不会,因为经验和颜色真的是不同的东西。但是如果
“green”.equals(Color.green)
“green.equals(Experience.green)
Color.green
必须等于
Experience.green


因此,一般规则是:不相关类型的对象不相等。

一般来说,不同类型的对象不相等,因为要满足相等契约规定的对称性,两个类必须相互了解

此外,因为平等必须是可传递的(这也是平等契约的规定),引入你的规则会产生奇怪的后果。考虑:

enum Color {
    green, red, blue;
}

enum Experience {
    green, novice, veteran;
}
应该
颜色.绿色
等于
经验.绿色
?可能不会,因为经验和颜色真的是不同的东西。但是如果
“green”.equals(Color.green)
“green.equals(Experience.green)
Color.green
必须等于
Experience.green


因此,一般规则是:不相关类型的对象不相等。

在表达式中,左侧的值是枚举。右边的值是一个字符串

较长的答案是,java中的.equals在默认情况下的求值意味着“同一对象的同一实例”,除非您使用不同的求值形式显式重写它。在EMUM的情况下,它们本质上是围绕着保证枚举中每个元素的单个实例值的语法糖。因此,enum equals会查看它是否是同一个元素


因此,MyENum.ONE是对MyENum实例的引用,其中只有一个实例。只要你有一个MyEnum.ONE,它就是同一个实例。如果您询问它是否有其他值与之相等,它只会对MyEnum.ONE实例响应true

在表达式中,左侧的值是枚举。右边的值是一个字符串

较长的答案是,java中的.equals在默认情况下的求值意味着“同一对象的同一实例”,除非您使用不同的求值形式显式重写它。在EMUM的情况下,它们本质上是围绕着保证枚举中每个元素的单个实例值的语法糖。因此,enum equals会查看它是否是同一个元素


因此,MyENum.ONE是对MyENum实例的引用,其中只有一个实例。只要你有一个MyEnum.ONE,它就是同一个实例。如果您询问它是否有其他值与之相等,它只会对MyEnum.ONE实例响应true

为什么您希望它的计算结果为
true
?我认为您需要退后一步,真正尝试了解
equals
hashCode
在Java中的用法。它们是Java中最重要的两个契约。为什么您希望它的计算结果是
true
?我认为您需要退后一步,真正尝试了解
equals
hashCode
在Java中的用法。它们是Java中最重要的两个契约。+1:“对于
equals()
的对称性,两个类必须相互了解”;+1:“对于
equals()
的对称性,两个类必须相互了解”。