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

Scala类层次结构中的不规则性

发布时间:2020-12-16 18:03:47 所属栏目:安全 来源:网络整理
导读:Scala在 Java的类型系统上叠加了一个非常优雅的类层次结构,从顶部的Any,到AnyRef和AnyVal,分别覆盖Java的对象和基元,然后最终收敛,将引用类型折叠到Null,将所有类型折叠到Nothing上.据我所知,没有什么是一切的子类型; Null AnyRef / java.lang.Object的所有
Scala在 Java的类型系统上叠加了一个非常优雅的类层次结构,从顶部的Any,到AnyRef和AnyVal,分别覆盖Java的对象和基元,然后最终收敛,将引用类型折叠到Null,将所有类型折叠到Nothing上.据我所知,没有什么是一切的子类型; Null AnyRef / java.lang.Object的所有子类型的子类型. [见 http://www.scala-lang.org/node/128]

但是,似乎存在一些不规则性,一些地方不能简单地将所有Scala类型视为无缝类型层次结构的元素.我觉得这很令人厌烦,想要了解我可能感到惊讶的地方.

到目前为止,我知道一些违规行为:

1)虽然Null是AnyRef的子类型,但调用null.isInstanceOf [AnyRef](或AnyRef的其他子类型)会返回false.我怀疑这被选择与Java的instanceof运算符的行为一致.

2)无论方差注释如何,一切都与Nothing协变.如果我有一个方法返回一个没有标记协变的类型T,我可以覆盖该方法返回类型Nothing. [注意:这个说法有误,请参阅下面的答案和评论!]

3)我不能将isInstanceOf应用于AnyVal类型[见Why can AnyVal not be used in an isInstanceOf check?和How to test a value on being AnyVal?]

4)询问是否有一个isInstanceOf [Null]是非法的,这是一个完全连贯的问题(尽管不是特别必要,因为“myVar == null”会给出相同的答案)

在Scala的类型层次结构中是否存在其他不规则或特殊情况的示例?我觉得这些值得学习和理解,以避免不受欢迎的惊喜.

解决方法

1)“字符串是AnyRef的子类型”.isInstanceOf [AnyRef]返回true.对于AnyRef的其他子类型也是如此,除了Null.正如你所说,唯一不正常的做法是与Java保持一致.

2)如果B是A的子类型,即B<:A,则可以始终覆盖方法:

def foo: A = ...

至:

override def foo: B = ...

这称为精炼返回类型,并且始终允许.由于Nothing是所有其他类型的子类型(Nothing&lt ;: A for all A),因此您始终可以将返回类型细化为Nothing(例如,通过在方法体中抛出异常).这是一个非常规则的财产.返回类型协方差与variance annotations on type parameters没有直接关系.

3)其他问题很好地涵盖了这一点.

4)这是因为Java运行时中不存在Null类型.我想如果你想模仿这个,你可以创建自己的instanceOf方法 – 你首先要检查参数是否为null,否则,执行正常的isInstanceOf检查.

还有其他违规行为,是的.参见例如:If an Int can’t be null,what does null.asInstanceOf[Int] mean?

数组是另一个例子,你可以在运行时使用装箱/拆箱或实例检查来支付通用数组的一致性.新的Array [Any]被翻译成一个对象数组 – 将一个整数存储到数组中将导致装箱.无论何时使用Array [T],其中T没有上限,每次索引元素时,数组都将与正确的运行时数组类型进行图案匹配.

为了更好地理解你可能会感到惊讶,考虑如何将这些结构转换为JVM,其中有原始和引用类型的概念,装箱/拆箱和不同的数组类是有用的.

(编辑:李大同)

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

    推荐文章
      热点阅读