如何从泛型类型实例化 Scala 3 枚举

问题描述 投票:0回答:1

假设我在 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 的其他值抛出异常。

scala generics enums scala-3
1个回答
0
投票
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")

© www.soinside.com 2019 - 2024. All rights reserved.