在运行时应用所有这些Scala特性会产生什么样的影响?

时间:2011-06-30 16:38:52

标签: scala traits

想象一下:

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编译器是否足够智能以在编译时生成适当的代码?如果您有多个地方正在应用上述代码中的特征,它会对代码产生什么样的性能影响?

2 个答案:

答案 0 :(得分:11)

它是在编译时编写的

特征将作为接口添加到结果类型中,并且这些特征中的任何具体方法将(通常)完整地复制到类中。

有时,编译器可能必须通过转发器向静态方法提供具体实现,但通常情况并非如此。

答案 1 :(得分:6)

Scala将创建三个匿名类,(除了最后一个条件是语法错误)。

注意:这些类将使用 order 命名,在其中定义它们的范围。所以... OuterClass $ anon $ 1 - > 3.请避免在任何长期Java序列化中使用这些匿名类,因为这会锁定代码中匿名类的顺序。

除此之外,这是一个非常方便的功能!