假设我在 Scala 3 中有一个具有以下签名的方法:
def foo[E <: scala.reflect.Enum](str: String): E
如何根据str实例化E?
例如,如果 E 是:
enum MyEnum:
case a1, a2
然后我希望该函数对于 str = "a1" 返回 MyEnum.a1,对于 str = "a2" 返回 MyEnum.a2,并对 str 的其他值抛出异常。
def foo[E <: scala.reflect.Enum](str: String)(using ev: Manifest[E]): E = {
val values = ev.runtimeClass.getMethod("values").invoke(null).asInstanceOf[Array[E]]
values.find(_.toString == str).getOrElse(throw Exception("not found"))
}
然后就可以调用了:
foo[MyEnum]("a1")