使用另一个mixin特征进行特征实例化

时间:2016-02-07 12:25:42

标签: scala

很明显,这不起作用:

trait A
val a = new A 

因为traits无法实例化(如果我们在{}之后添加new A那么它会起作用,因为我们正在创建一个匿名类。)

然而,这确实有效,我不知道为什么:

trait A
trait B
val a = new A with B

线性化过程是否会自动为基本特征或什么创建匿名类?

1 个答案:

答案 0 :(得分:4)

来自the spec的第5.1节:

  

可以编写以特征开头的父母列表   参考,例如mt1 with ... with mtn。在那种情况下,父母的名单   隐式扩展为包含mt1的超类型作为第一个父级   类型。新的超类型必须至少有一个构造函数   不参加参数。

因此,当您撰写new A with B并且A是一个特征时,您实际上正在获得new AnyRef with A with B。我不是100%确定为什么同样的转换不适用于new MyTrait,但我猜它与避免特征和类之间的混淆有关。