很明显,这不起作用:
trait A
val a = new A
因为traits无法实例化(如果我们在{}
之后添加new A
那么它会起作用,因为我们正在创建一个匿名类。)
然而,这确实有效,我不知道为什么:
trait A
trait B
val a = new A with B
线性化过程是否会自动为基本特征或什么创建匿名类?
答案 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
,但我猜它与避免特征和类之间的混淆有关。