我有一个问题:我不知道我无法用==运算符比较两个不同的枚举。这是我的代码:
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));
}}
非常感谢。
答案 0 :(得分:2)
出于同样的原因,您不能说
String s = "1";
int t = 1;
if (s == t) {
s2
和t
是不同的类型。它们不可比。
在后台,枚举类型会编译出它们的名称,因此除非将其强制转换为兼容类型,否则它不会做您想要的事情。如果要执行此操作,则应使用name()
或toString()
。参见例如this answer。
if (s2.name().equals(t.name())) {
通常,对象上的==
检查它们是否引用相同的内存。这似乎不是您要在此处检查的内容。您似乎正在寻找基元上的行为(如果值相等,则等于),您不会从这样的对象比较中获得这种行为。
答案 1 :(得分:2)
Enum.Equals()比较两个枚举的类型和值是否相等。因此,在两种不同类型的Enum上使用它是合法的。另一方面,==运算符比较两个枚举的数值,并假定为相同类型。您的第一个测试失败,因为Seasons和TestResult不是同一类型。后者之所以成功,是因为它们都基于Enum类型-它们只是不相等。如果您确实需要使用两种不同的技术,则可以解决此问题。
但是,我会建议您谨慎使用它们,因为它们以后可能会引起各种麻烦。枚举是不同类型的,大概是有原因的。绕开这个原因是一个问题,即“为什么?”这个问题。如果您对这个问题有一个合理的答案,那么也许您真正应该看的是重构代码以使其成为不必要。
现在,关于如何摆脱与它们的比较,我向您保证了两种方法。首先是价值。将两个枚举都转换为int并按值进行比较,例如((int)s2)==((int)t);。这与使用运算符==基本上相同,只是您已从比较中删除了类型。第二个含义是-通过将枚举都转换为字符串来比较枚举本身,因此是s2.ToString()。Equals(t.ToString());。这样会将“ SPRING”与“ PASS”进行比较,因此数字等效性不再是问题。
如果应该可以将两个枚举相互转换,那么也许您应该看的就是先明确地进行转换,然后比较它们。通过这种方式,您可以使目标更清晰,如果您发现自己试图在几年内维护该代码,将会使自己更加快乐。这是更实际的工作,但它将提高可读性。