想象一下:
val myObject = if(someCondition) {
new Whatever with Trait1
} else if(otherCondition) {
new Whatever with Trait2 with Trait3 with Trait4
} else {
new Whatever with Trait5
}
Run Code Online (Sandbox Code Playgroud)
myObject
对象是否在运行时"组合",或者scala编译器是否足够智能以在编译时生成适当的代码?如果您有多个地方正在应用上述代码中的特征,它会对代码产生什么样的性能影响?
Kev*_*ght 11
它是在编译时编写的
这些特征将作为接口添加到结果类型中,并且这些特征中的任何具体方法将(通常)完整地复制到类中.
有时,编译器可能必须通过转发器向静态方法提供具体实现,但通常情况并非如此.
Scala将创建三个匿名类(除了最后一个条件是语法错误).
注意:这些类将使用在定义范围内定义它们的顺序命名.所以... OuterClass $ anon $ 1 - > 3.请避免在任何长期Java序列化中使用这些匿名类,因为这会锁定代码中匿名类的顺序.
除此之外,这是一个很棒的便利功能!