我想我还没有在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
我做错了什么?
答案 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_EQUAL
是EnumTestOperator
的一个实例。您无法将其与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");
}