比较一个枚举值列表和一个枚举

时间:2019-07-03 07:02:38

标签: java

编辑:稍微修改了代码以使用实际的枚举,但我仍然看到我所指的问题。

我有一个以前从未见过的怪异场景,以下代码是在Java 6以及我认为之前构建的,但是我不确定,因为该代码是在2008年写的,因此我们没有办法知道该代码是在哪个Java版本上写的,基本上,将枚举值列表与单个枚举值进行比较,假设该列表最多只包含一个值,并且该比较在Java 6及更早版本上可以正常工作(我'不确定版本),但在Java 7中失败

我在网上查了一下,但是找不到任何相关信息,因此希望有人能澄清一下。这是重现我所指问题的示例-

修改后的代码-

public class TestEnum {
    enum Color {
        RED, GREEN, BLUE;
    }

    public static void main(String[] args) {
        List<Color> enums = new ArrayList<Color>();
        enums.add(Color.RED);
        if (enums.equals(Color.RED)) {
            System.out.println("Passed the conditional check!!!");
        } 
        else {
            System.out.println("Failed the conditional check!!!");
        }
    }

即使我的枚举值列表仅包含一个常量Color.RED,并且我正在使用equals to方法进行比较,为什么上面的条件检查仍然失败?上面提到的代码始终会打印“条件检查失败”。

2 个答案:

答案 0 :(得分:2)

回答这个问题:

  

但是现在我看到即使列表包含枚举ActionEnum.NONE,比较也返回false。

不,不是。当该内部列表包含ActionEnum.NONE时,将返回true并在此停止执行方法。

此方法返回false方法是:

  • getFormats()返回一个空列表,或者
  • 所有Action对象(通过getActionEnum()检索)为空或不包含ActionEnum.NONE

现在,您可以将其重写为:

for (Format f : getFormats()) 
  for (ActionEnum e : f.getActions()) 
    if (e.getActionEnum == ActionEnum.NONE) 
      return true;
return false;

编辑:我的代码假设一个叫做ActionEnum的东西实际上是一个真正的枚举。但是因为不是这种情况,所以在这里==不会被e.equals()代替!

关于另一个更新:另一个答案是正确的:您当前的代码执行 someList。等于(somethingThatIsNotAList)。那将总是返回false。您需要enums.contains(someEnum)来代替。

答案 1 :(得分:1)

您正在比较List和Enum等于总是返回false的情况。如果您使用包含而不是等于,则该条件将起作用。

if (enums.contains(ActionEnum.NONE)) {