Scala模式匹配Java枚举类型

时间:2014-06-06 17:30:40

标签: scala enums

我有一个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

我没有足够的信息来理解错误的根本原因。有什么想法吗?

2 个答案:

答案 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