2 回答
TA贡献1895条经验 获得超3个赞
出于同样的原因,你不能说
String s = "1";
int t = 1;
if (s == t) {
s2并且t是不同的类型。他们没有可比性。
在后台,枚举类型编译出它们的名称,因此除非它强制转换为兼容类型,否则这不会做你想要的。如果你想这样做,你应该使用name()或toString()。参见例如这个答案。
if (s2.name().equals(t.name())) {
通常,==对象检查它们是否引用相同的内存。这似乎不是您想要在这里检查的内容。您似乎正在寻找基元的行为(如果值相等则相等),您不会从这样的对象比较中获得。
TA贡献1860条经验 获得超8个赞
Enum.Equals() 比较两个枚举的类型和值是否相等。因此在两种不同类型的 Enum 上使用它是合法的。另一方面,== 运算符比较两个枚举的数值并假定它们是相同的类型。您的第一个测试失败,因为 Seasons 和 TestResult 不是同一类型。后一个成功是因为它们都基于 Enum 类型 - 它们只是不等价。如果您确实需要使用两种不同的技术,您可以解决这个问题。
但是,事先我会建议您谨慎使用它们,因为它们可能会在以后引起各种麻烦。枚举是不同的类型,大概是有原因的。回避这个原因是一个引出“为什么?”的问题。如果您对这个问题有一个合理的答案,那么也许您真正应该考虑的是重构您的代码以使其变得不必要。
现在,对于无论如何如何避免比较它们,我承诺了两种方法。首先是按价值。将两个枚举转换为整数并按值比较它们,例如 ((int)s2) == ((int)t);。这与使用运算符 == 基本相同,只是您从比较中删除了类型。第二个是意义 - 通过将它们都转换为字符串来比较枚举本身,因此 s2.ToString().Equals(t.ToString());。这会将“SPRING”与“PASS”进行比较,因此数字等效不再是问题。
如果应该可以将您的两个枚举相互转换,那么您可能应该首先明确地进行转换,然后再比较它们。通过这种方式,您可以更清晰地表达您的目的,如果您发现自己试图在几年后维护该代码,这将使您更快乐。这是更实际的工作,但它会在可读性方面带来好处。
添加回答
举报