我正在处理一些混合的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)
将是理想的,但我不确定这是否可能。
谢谢你能给我的任何帮助!
答案 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"))