当前位置: 首页 > 知识库问答 >
问题:

如何在Java中比较switch语句中的字符串和枚举?

梁丘缪文
2023-03-14

我想我还没有在Java中得到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个答案

宋望
2023-03-14

枚举测试运算符。NOT_EQUAL是枚举测试算子的一个实例。不能将其与字符串进行比较。

您可以均匀地比较EnumTestOperator。不相等。toString()带有字符串,但不在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");
}

丌官盛
2023-03-14

您正在比较不兼容的类型。它类似于语句

"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放入开关将引发NullPointerException

 类似资料:
  • 我是MVC编程的新手。所以我用的是play框架。 获取未捕获的引用Error:未定义MODERATED

  • 问题内容: 我正在用Java制作轮盘赌(我自己的版本),而玩家可以打赌的类型之一就是选择将要滚动的颜色。(偶数是黑色,奇数是红色)。有没有一种方法可以使用switch语句将字符串与枚举进行比较? 这就是我想要得到的,但这并不是让我在switch语句中使用枚举“颜色”。 问题答案: 您必须具有要在其上进行切换的枚举类型的实例(其 成员 )。您正在尝试打开Enum类本身,这是没有意义的构造。所以你可能

  • 它在两个case语句上都显示错误“case表达式必须是常量表达式”。 那么我如何在swtich语句中使用字符串枚举呢?

  • 问题内容: 我试图在z DBOpenHelper扩展SQLOpenHelper类中编写一个方法。它应该评估数据库中是否存在相同名称的条目。 这是Contact类的相关部分: 现在这是奇怪的事情: 方案A:其中和 等于false。Eclipse调试器显示名称的foo和cname的foo具有不同的id。这两个变量都按之前在代码中所示填充。 方案B:像这样加载变量的地方: 方案C:等于true …但是…

  • 问题内容: 我有一个程序正在制作,当用户输入一种心情时,它将在此基础上输出报价。我需要告诉程序 问题是,我不知道如何使程序识别输入并基于该输出文本…这是到目前为止我所拥有的代码。 问题答案: 首先,看起来您正在处理错误的变量。我想你打算比较。 处理字符串时,请始终使用而不是。比较参考值(通常不可靠),同时比较实际值。 将您的字符串转换为全部大写或全部小写也是一个好习惯。在本示例中,我将使用小写字母

  • 问题内容: 在java中如何比较字符串,使用==还是equals 问题答案: == 测试引用是否相等(它们是否是同一对象)。 .equals() 测试值是否相等(在逻辑上是否为“相等”)。 String.contentEquals() 将的内容String与任何内容进行比较CharSequence(从Java 1.5开始可用)。 因此,如果要测试两个字符串是否具有相同的值,则可能要使用Object