如何在未知具体类型的情况下从AnyVal中提取值?
如何从AnyVal实例中提取底层值?
给定以下Scala代码:
case class CustomerId(value: String) extends AnyVal val someId: AnyVal = CustomerId("asdf-123") def magicExtractor(anyAnyVal: AnyVal): String = ??? assert("asdf-123" == magicExtractor(someId))
要求实现magicExtractor方法,但禁止通过穷举所有AnyVal子类的方式完成。
解决方案:利用反射实现通用提取
由于Scala值类(AnyVal子类)在运行时会被装箱为对应的引用类型,且自定义值类通常只包含一个存储底层值的字段,我们可以通过反射来通用提取这个值:
import java.lang.reflect.Field def magicExtractor(anyAnyVal: AnyVal): String = { // 获取值类的唯一字段 val underlyingField = anyAnyVal.getClass.getDeclaredFields.head // 允许访问私有字段 underlyingField.setAccessible(true) // 取出字段值并转为字符串 underlyingField.get(anyAnyVal).toString }
这个方法不需要提前知晓所有AnyVal子类,能适配任意符合标准定义的自定义值类,满足需求中的断言要求。
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

