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

为什么在Scala中可以在运行时将AnyVal转换为AnyRef?

发布时间:2020-12-16 18:52:05 所属栏目:安全 来源:网络整理
导读:可以编译以下代码而不会出现错误. val a: Int = 1val b = a.asInstanceOf[AnyRef] 这让我感到困惑,因为Int扩展了AnyVal,它不是子类,而是AnyRef的兄弟. 但是,如果使用ascription如下: val a: Int = 1val b: AnyRef = a 它不起作用. error: type mismatch; fo
可以编译以下代码而不会出现错误.

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.
但是,归属是在编译时,转换不能通过类型检查,所以我们有一个“类型不匹配”错误.

我的问题:

>基本上,为什么转换在运行时工作?
>如果在JVM中将AnyRef视为java.lang.Object,AnyVal怎么样?它是运行时的对象吗?

>(如果是的话,它的类型是什么?java.lang.Object?但是AnyVal是AnyRef的兄弟,不是吗?)
>(如果没有,我们如何使用一些AnyVal的子类作为Object,如Int,Double)
> scala编译器是否有一些技巧?

解决方法

这是因为自动装箱:

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的自动装箱

If AnyRef is considered as java.lang.Object in JVM,how about AnyVal ?
Is it an Object at run time ?

AnyRef确实是java.lang.Object的别名
AnyVal是一个“虚拟”类型,它只在编译时存在,以便于类型系统的完整性.

在运行时,扩展AnyVal的实例将转换为相应的本机类型(int,double等),但String转到java.lang.String,它本身扩展了java.lang.Object但在JVM中有特殊处理.

But AnyVal is sibling of AnyRef,isn’t it ?)

AnyVal和AnyRef都扩展了Any类型,但它们不会相互扩展.

Are there some tricks played by scala compiler ?

加载:)

有关Scala类型层次结构的更完整说明,建议您先阅读:http://docs.scala-lang.org/tutorials/tour/unified-types.html

(编辑:李大同)

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

    推荐文章
      热点阅读