8

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

例子:

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
4

2 回答 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!")

NothingAnyRef with AnyVal根据定义的子类型,因此该声明类型检查。

于 2012-07-01T12:55:51.957 回答
3

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

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

于 2012-07-01T10:32:02.830 回答