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