为什么在Scala中可以在运行时将AnyVal转换为AnyRef?
可以编译以下代码而不会出现错误.
val a: Int = 1 val b = a.asInstanceOf[AnyRef] 这让我感到困惑,因为Int扩展了AnyVal,它不是子类,而是AnyRef的兄弟. 但是,如果使用ascription如下: val a: Int = 1 val b: AnyRef = a 它不起作用. error: type mismatch; found : Int required: AnyRef Note: an implicit exists from scala.Int => java.lang.Integer,but methods inherited from Object are rendered ambiguous. This is to avoid a blanket implicit which would convert any scala.Int to any AnyRef. You may wish to use a type ascription: `x: java.lang.Integer`. val b: AnyRef = a 我的理解是: asInstanceOf在运行时执行,它强制编译器相信val a是AnyRef. 我的问题: >基本上,为什么转换在运行时工作? >(如果是的话,它的类型是什么?java.lang.Object?但是AnyVal是AnyRef的兄弟,不是吗?) 解决方法
这是因为自动装箱:
scala>val a: Int = 1 a: Int = 1 scala> a.getClass res2: Class[Int] = int scala> val b = a.asInstanceOf[AnyRef] b: AnyRef = 1 scala> b.getClass res1: Class[_ <: AnyRef] = class java.lang.Integer 通过强制转换为AnyRef(java.lang.Object),您可以触发从int到java.lang.Integer的自动装箱
AnyRef确实是java.lang.Object的别名 在运行时,扩展AnyVal的实例将转换为相应的本机类型(int,double等),但String转到java.lang.String,它本身扩展了java.lang.Object但在JVM中有特殊处理.
AnyVal和AnyRef都扩展了Any类型,但它们不会相互扩展.
加载:) 有关Scala类型层次结构的更完整说明,建议您先阅读:http://docs.scala-lang.org/tutorials/tour/unified-types.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |