如何在Java中的switch语句中比较string和enum?

时间:2016-03-30 11:34:24

标签: java enums switch-statement

我想我还没有在Java中获得Enum的概念。

我尝试将字符串与我的枚举项比较Special characters in an enum

package com.stackoverflow.tests;

public class EnumTest {

  enum EnumTestOperator {
    EQUAL("=="),
    NOT_EQUAL("!=");

    private String value;

    private EnumTestOperator(String value) {
      this.value = value;
    }

    public String toString() {
      // will return == or != instead of EQUAL or NOT_EQUAL
      return this.value;
    }

  }

  public static void main(String[] args) {
    String line;
    line  = "<>";
    line  = ".ne.";
    line  = "!=";

    // Operator
    switch(line) {
//      case "!=":
      case EnumTestOperator.NOT_EQUAL:
        System.out.println("Not Equal");
        break;
      default:
        System.out.println("Something else");
        break;
    }
  }

}

但是在线:

case EnumTestOperator.NOT_EQUAL:

我收到编译错误:

Type mismatch: cannot convert from EnumTest.EnumTestOperator to String

我做错了什么?

2 个答案:

答案 0 :(得分:4)

您正在比较不兼容的类型。它与声明

类似
"some string" == EnumTestOperator.NOT_EQUAL

将字符串值与枚举常量进行比较。

停止使用枚举并将它们声明为字符串常量:

private static final String EQUAL = "==";
private static final String NOT_EQUAL = "!=";

然后你可以在开关/盒子中使用它们。

另一个解决方案是根据您的输入找到枚举常量。将其添加到您的枚举:

public static EnumTestOperator byValue(String val){
  for(EnumTestOperator en:values()){
    if(en.value.equals(val)){
      return en;
    }
  }
  return null;
}

然后使用这样的函数:

EnumTestOperator en = EnumTestOperator.byValue(line);
switch(en) {
  case NOT_EQUAL:
    System.out.println("Not Equal");
    break;
  default:
    System.out.println("Something else");
    break;
}

不幸的是,您必须以不同的方式处理null案例,因为将null放入switch会抛出NullPointerException

答案 1 :(得分:1)

EnumTestOperator.NOT_EQUALEnumTestOperator的一个实例。您无法将其与String进行比较。

您甚至可以将EnumTestOperator.NOT_EQUAL.toString()String进行比较,但不能在case语句中进行比较(case语句需要Java中的常量表达式。)

但你可以改为迭代EnumTestOperator常数:

public static EnumTestOperator find(String strValue) {
  for(EnumTestOperator operator : EnumTestOperator.values()) {
    if(operator.toString().equals(strValue)) {
      return operator;
    }
  }
  throw new IllegalArgumentException("No matching value");
}