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

问题描述 投票:0回答:2

为什么我可以说类型字段具有一个类的类型,其中混合了另一个类(当类中只能混合特征时)?

示例:

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
class scala
2个回答
6
投票

mixin 实例化和复合类型定义之间存在差异。 首先,类型

A with B
存在并且正是类型
B
,唉,它在scala中编写是完全合法的

val x: A with B = new B

原样

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

因为它描述了完全相同的类型。 您只是对可以分配给该类型变量的值的类型引入限制。 当然,在这种情况下,这些限制始终有效。

此外,你必须记住,Scala 不一定需要一个类型来居住 - 即底部类型

Nothing
可能根本不会被实例化。 但由于
Nothing
是可以在 Scala 中表达的每种类型的子类型,因此编写像

这样的表达式甚至是有效的
def foo: AnyRef with AnyVal = sys.error("IMPOSSIBRU!")
根据定义,

Nothing
AnyRef with AnyVal
的子类型,因此声明类型检查。


3
投票

这称为复合类型,与特质无关。它允许您表达某种类型是其他几种类型的子类型。

有关它们可能发生的位置的更多信息,请参阅“类型处理”部分中的Scala 标记信息

© www.soinside.com 2019 - 2024. All rights reserved.