gpt4 book ai didi

scala - 一些带有 asInstanceOf 的构造函数

转载 作者:行者123 更新时间:2023-12-01 04:09:48 25 4
gpt4 key购买 nike

当我写我的 recent answer我还尝试以更“实用”的方式解决问题,但遇到了以下问题:

scala> "1".asInstanceOf[Int]
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at scala.runtime.BoxesRunTime.unboxToInt(Unknown Source)
...
scala> Some("1".asInstanceOf[Int])
res29: Some[Int] = Some(1)
并且只有
scala> res29.get
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at scala.runtime.BoxesRunTime.unboxToInt(Unknown Source)
...

看起来 Some 的参数是惰性求值的,但我在 the sources 中找不到任何线索. Some 构造函数中的 x 参数是严格的。

为什么 Some 和 asInstanceOf 有如此奇怪的行为?

最佳答案

构造函数参数不是惰性求值的。出现错误的那一刻就是 REPL 尝试将结果显示为 Int ( unboxToInt ) 的那一刻。如果您在堆栈中进一步查看,您会发现 scala_repl_result .

我相信问题在于asInstanceOf[Int]在运行时根本不检查。我不知道这是根据规范(对于值类型)还是错误。编译器被欺骗接受 "1"Int (或盒装 Int),等待 asInstanceOf 隐含的运行时检查,但不会发生。

Option/Some不是专门的,在运行时只有 Some[Object] .所以对于 JVM,有一个对构造函数 new Some(Object o) 的调用,它在代码验证和运行时被接受。 toString (由 REPL 在新构建的 Some 上调用)位于通用代码中,其中 T 被视为 Object也是(或 AnyRef),所以它可以工作,并且 Some(1)被陈列。另一方面,每次在编译器知道泛型参数类型的上下文中访问该值时,都会在代码中插入一个强制转换(如果是值类型,则取消装箱)。这是它实际失败的时候(这里 REPL 在显示之前进行拆箱)。

编辑 这是在 Scala 2.8.1 中。根据上面@incrop 的评论,现在已修复。

关于scala - 一些带有 asInstanceOf 的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6924665/

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