Scala:使用带有valueOf的Java枚举和参数化函数

时间:2014-01-10 03:04:29

标签: java scala enums

我正在处理一些混合的Java / Scala代码,因为我对Scala有点新,我遇到的问题似乎应该是容易解决,但这让我很难过。

我在Java中有许多枚举,我想要做的是编写一个通用的参数化Scala函数,该函数接受List[String]并将其转换为Set枚举值:< / p>

// Not sure if <: is the right operator to say T is a Java enum here.
def strToEnumSet[T <: Enum[T]](values: List[String]): Set[T] =
values.map(x => T.valueOf(x)).toSet

这不起作用,因为我们无法将T用作T.valueOf,我理解。我怀疑我们必须使用Enum.valueOf(Class<T> enumType, String s)方法。但是,我不确定正确执行此操作的语法。

我是否需要做以下事情:

def strToEnumSet[T <: Enum[T]](cls: Class[T], values: List[String]): Set[T] =
   values.map(x => Enum.valueOf(cls, x)).toSet

如果是的话,我会为cls传递什么?假设我想要使用名为enum的{​​{1}}和名为MyEnum的{​​{1}}来调用特定实例:

List[String]

我会为values

传递什么

当然,避免传递val myEnumSet: Set[MyEnum] = strToEnumSet[MyEnum](???, values) 将是理想的,但我不确定这是否可能。 谢谢你能给我的任何帮助!

1 个答案:

答案 0 :(得分:1)

这对我有用:

X.java:

public enum X {
    a,
    b,
    c
}

Test.scala:

val a = strToEnumSet(classOf[X], List("a"))

可能的改进:

def strToEnumSet[T <: Enum[T]](values: Iterable[String])(implicit m: Manifest[T]): Set[T] =
values.map(x => Enum.valueOf(m.runtimeClass.asInstanceOf[Class[T]], x)).toSet

您可以这样称呼它:

val a = strToEnumSet[X](List("a"))