nar*_*thi 5 reflection scala scala-2.10 value-class
我反思性地调用一个方法,其参数可能是也可能不是值类的实例.由于值类的目的是避免基础值的装箱,如果参数类型是值类,那么所讨论的方法实际上将期望未装箱的值.为了处理这种情况,我试图从值类中解包基础值.我首先需要确定参数是否是值类,在这里我遇到了第一个绊脚石:
def isObjectOfValueClass(arg: Any) =
classOf[AnyVal].isAssignableFrom(arg.getClass)
Run Code Online (Sandbox Code Playgroud)
这不能按预期工作,因为该方法返回true:
case class NonValueClass(underlying: Int)
Run Code Online (Sandbox Code Playgroud)
如何isObjectOfValueClass实施?或者是否有一种更简单的方法来反射调用可能将值类的对象作为参数的方法?
首先,请注意,您isObjectOfValueClass将获得值类实例的盒装版本。
其次,它不能按照你想要的方式工作。这是因为classOf[AnyVal] == classOf[AnyRef] == <java.lang.Object>。
没有运行时方法来区分装箱值类和引用类(Any没有.instanceOf[T],AnyVal不能用于模式匹配或作为 的参数.instanceOf[T],最重要的是,编译后的值类不会扩展或实现AnyVal)。
如果您希望它由编译时间决定,请尝试:
case class IsAnyVal[-T](val value: Boolean) extends AnyVal
implicit def _noClueHowToNameThisImplicit_1 = IsAnyVal[AnyVal](true)
implicit def _noClueHowToNameThisImplicit_2 = IsAnyVal[AnyRef](false)
def isAnyVal[T](arg: T)(implicit ev: IsAnyVal[T]) = ev.value
scala> isAnyVal(1)
res4: Boolean = true
scala> isAnyVal("")
res5: Boolean = false
Run Code Online (Sandbox Code Playgroud)
我不确定您希望如何提取检测到的装箱值类实例的唯一字段,而不会出现更多意外装箱。此外,Hotspot 非常擅长优化小型短寿命对象。