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

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

发布时间:2020-12-16 08:46:55 所属栏目:安全 来源:网络整理
导读:当我写 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 Sourc
当我写 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中找不到任何线索.As构造函数中的x参数是严格的.

为什么有些asInstanceOf会有这么奇怪的行为?

解决方法

构造函数参数未被延迟评估.您收到错误的那一刻是REPL尝试显示结果的时刻,作为Int(unboxToInt).如果你进一步查看堆栈,你会发现scala_repl_result.

我相信问题是asInstanceOf [Int]在运行时根本没有检查.我不知道它是否符合规范(对于值类型)或bug.编译器被欺骗接受“1”是Int(或盒装Int),等待asInstanceOf暗示的运行时检查,但不会发生.

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

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

(编辑:李大同)

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

    推荐文章
      热点阅读