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

Scala的类层次结构

发布时间:2020-12-16 18:45:24 所属栏目:安全 来源:网络整理
导读:关于 Scala类层次结构的问题: 在IntelliJ IDE中,我正在寻找Any和AnyRef的实现,但它们并不存在. 他们在哪里定义,我怎么能看到他们的代码? 我在“Scala编程”中阅读了以下内容 The only case where == does not directly call equals is for Java‘s boxed n
关于 Scala类层次结构的问题:

>在IntelliJ IDE中,我正在寻找Any和AnyRef的实现,但它们并不存在.
他们在哪里定义,我怎么能看到他们的代码?
>我在“Scala编程”中阅读了以下内容

The only case where == does not directly call equals is for Java‘s
boxed numeric classes,such as Integer or Long. In Java,a new
Integer(1) does not equal a new Long(1) even though for primitive
values 1 == 1L. Since Scala is a more regular language than Java,it
was necessary to correct this discrepancy by special-casing the ==
method for these classes.

嗯……但不是==最终?他们是如何为Java的数字类做出特殊情况的?

解决方法

Any,AnyRef,Null,Nothing实际上并不存在;包含它们是为了使类型系统完整,但它们没有真正的表示.您可以找到 a reference in Scala’s repository,但正如它所说,这些实际上并不是为了文档和引导目的而编译和存在. Scala的3 Any * s实际上是编译后的字节码中的所有java.lang.Object.

另外,原始值类(Int,Long等)都是定义的最终抽象,这意味着它们实际上也不存在.他们所有的方法都是抽象的.

为了使一切看起来干净整洁,更重要的是工作,编译器的工作就是伪造这些类型的存在并执行魔术以使它们全部结合在一起.这是允许==进行空值检查并正确处理值类型的原因,即使它是最终的,因为编译器正在围绕它进行魔术.在新的java.lang.Integer(5)== new java.lang.Long(5)的情况下,它归结为scala.runtime.BoxesRuntime.equalsNumNum(new java.lang.Integer(5),new java. lang.Long(5)).

(编辑:李大同)

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

    推荐文章
      热点阅读