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

时间:2012-07-01 10:06:31

标签: class scala

为什么我可以说类型字段的类型与另一个类混合在一起(当只有特征可以在类中混合时)?

示例:

scala> class A
defined class A

scala> class B extends A
defined class B

不允许在BA中混音:

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

2 个答案:

答案 0 :(得分: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!")
根据定义,

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

答案 1 :(得分:3)

这称为compound type,与特征无关。它允许您表示类型是其他几种类型的子类型。

有关可能出现的更多信息,请参阅“{3}}”部分“类型处理”。