我有一个Java枚举类型,它有一些字符串,我想模式匹配。这是我到目前为止所做的:
public enum MyEnum {
YEAR, MONTH;
}
在我的scala函数中,我执行以下操作:
timePeriod.toUpperCase match {
case MyEnum.YEAR.name => doSomething
case MyEnum.MONTH.name => doSomething
}
编译时,我收到以下错误:
stable identifier required, but YEAR.name found
我没有足够的信息来理解错误的根本原因。有什么想法吗?
答案 0 :(得分:7)
您不能将方法调用作为匹配中的子句,因为方法的结果可能不同。我们知道在这种情况下它没有,但是没有办法向编译器指示方法调用是常量。
你可以这样做:
timePeriod.toUpperCase match {
case period if period == MyEnum.YEAR.name =>
case period if period == MyEnum.MONTH.name =>
}
哪个更冗长。其他人可能会有更短更好的建议。
答案 1 :(得分:5)
您可以使用Java valueOf
的{{1}}方法进行查找:
Enum
MyEnum.valueOf(timePeriod.toUpperCase) match {
case MyEnum.YEAR => doSomething
case MyEnum.MONTH => doSomething
}
方法的分辨率是严格的,如果要解析的值不是枚举的一部分,则会抛出MyEnum.valueOf
。
如果您希望Enum不能解析值,您可能希望包含异常并添加默认匹配来处理它。这样做的惯用方法是:
java.lang.IllegalArgumentException