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