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

为什么可以在类型字段中混合类?

发布时间:2020-12-16 08:55:02 所属栏目:安全 来源:网络整理
导读:为什么我可以说类型字段的类型与另一个类混合在一起(当只有特征可以在类中混合时)? 例: scala class Adefined class Ascala class B extends Adefined class B 不允许将B混合到A: scala new A with Bconsole:10: error: class B needs to be a trait to b
为什么我可以说类型字段的类型与另一个类混合在一起(当只有特征可以在类中混合时)?

例:

scala> class A
defined class A

scala> class B extends A
defined class B

不允许将B混合到A:

scala> new A with B
<console>:10: error: class B needs to be a trait to be mixed in
             new A with B
                        ^

但这是可能的:

scala> class E {type T = A with B}
defined class E

scala> new E
res1: E = E@1f2bc83

解决方法

mixin实例化和复合类型定义之间存在差异.
首先,带有B的A类型存在并且正好是B类,唉,它在scala中完全合法

val x: A with B = new B

原样

val y: Any with AnyRef with A with B = new B

因为它描述了完全相同的类型.
您只是在可以为该类型的变量赋值的值类型中引入限制.
当然,这种限制总是适用于这种情况.

此外,你必须记住,Scala不一定需要有人居住的类型 – 即底层类型根本没有任何东西可以实例化.
但由于Nothing是可以在Scala中表达的每种类型的子类型,因此编写类似的表达式甚至是有效的

def foo: AnyRef with AnyVal = sys.error("IMPOSSIBRU!")

根据定义AnyRef的AnyRef没有任何子类型,因此声明类型检查.

(编辑:李大同)

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

    推荐文章
      热点阅读