【发布时间】:2016-02-07 20:45:11
【问题描述】:
很明显这是行不通的:
trait A
val a = new A
因为特征不能被实例化(如果我们在new A 之后添加{} 那么它会起作用,因为我们正在创建一个匿名类)。
但是,这确实有效,我不知道为什么:
trait A
trait B
val a = new A with B
线性化过程会自动为基本特征创建一个匿名类还是什么?
【问题讨论】:
标签: scala
很明显这是行不通的:
trait A
val a = new A
因为特征不能被实例化(如果我们在new A 之后添加{} 那么它会起作用,因为我们正在创建一个匿名类)。
但是,这确实有效,我不知道为什么:
trait A
trait B
val a = new A with B
线性化过程会自动为基本特征创建一个匿名类还是什么?
【问题讨论】:
标签: scala
来自the spec 的第 5.1 节:
可以编写一个以 trait 开头的父母列表 参考,例如
mt1 with ... with mtn。在这种情况下,父母名单 隐式扩展为包含mt1的超类型作为第一父级 类型。新的超类型必须至少有一个构造函数 不带参数。
所以当你写new A with B 并且A 是一个特征时,你实际上得到了new AnyRef with A with B。我不是 100% 确定为什么相同的转换不适用于 new MyTrait,但我猜想这与避免特征和类之间的混淆有关。
【讨论】: