加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala:识别值类的对象

发布时间:2020-12-16 18:35:43 所属栏目:安全 来源:网络整理
导读:我反思性地调用一个方法,其参数可能是也可能不是 value class的实例.由于值类的目的是避免基础值的装箱,如果参数类型是值类,那么所讨论的方法实际上是期望的未装箱的价值.为了处理这种情况,我试图从值类中解包基础值.我首先需要确定参数是否是值类,在这里我
我反思性地调用一个方法,其参数可能是也可能不是 value class的实例.由于值类的目的是避免基础值的装箱,如果参数类型是值类,那么所讨论的方法实际上是期望的未装箱的价值.为了处理这种情况,我试图从值类中解包基础值.我首先需要确定参数是否是值类,在这里我遇到了第一个绊脚石:

def isObjectOfValueClass(arg: Any) = 
  classOf[AnyVal].isAssignableFrom(arg.getClass)

这不能按预期工作,因为该方法返回true为:

case class NonValueClass(underlying: Int)

如何实现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

我不确定如何在没有更多意外装箱的情况下提取检测到的盒装值类实例的唯一字段.此外,Hotspot非常擅长优化小型短期对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读