【问题标题】:Trait instantiation using another mixin trait使用另一个混合特征的特征实例化
【发布时间】: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


    【解决方案1】:

    来自the spec 的第 5.1 节:

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

    所以当你写new A with B 并且A 是一个特征时,你实际上得到了new AnyRef with A with B。我不是 100% 确定为什么相同的转换不适用于 new MyTrait,但我猜想这与避免特征和类之间的混淆有关。

    【讨论】:

    • 正是我的预感,但您对规范的引用消除了任何疑虑。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    相关资源
    最近更新 更多