gpt4 book ai didi

Scala:识别值类的对象

转载 作者:行者123 更新时间:2023-12-04 20:44:53 24 4
gpt4 key购买 nike

我反射性地调用了一个方法,它的参数可能是也可能不是 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 非常擅长优化小生命周期的对象。

关于Scala:识别值类的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19656353/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com