scala 有没有一种方法可以从AnyVal中提取值而不知道它的确切类型?

xmq68pz9  于 7个月前  发布在  Scala
关注(0)|答案(1)|浏览(79)

这个问题几乎就在标题中。
例如,考虑以下代码:

case class CustomerId(value: String) extends AnyVal

val someId: AnyVal = CustomerId("asdf-123")

def magicExtractor(anyAnyVal: AnyVal): String = ???

assert("asdf-123" == magicExtractor(someId))

字符串
显而易见的是,在所有AnyVal子类的详尽列表上进行模式匹配不是一种选择。

8xiog9wr

8xiog9wr1#

由于AnyVal是所有原始类型和用户定义值类的基类,并且JVM会删除类型信息,因此唯一的方法是使用反射:

def magicExtractor(anyVal: AnyVal): String = {
  val mirror = runtimeMirror(anyVal.getClass.getClassLoader)
  val instanceMirror = mirror.reflect(anyVal)
  val members = instanceMirror.symbol.typeSignature.members

  members.collectFirst {
    case m: MethodSymbol if m.isGetter => instanceMirror.reflectMethod(m).apply().toString
  }.getOrElse(throw new IllegalArgumentException("Unable to extract value"))
}

字符串
如果你在最后分享你选择的方式,那就太好了。

相关问题