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

Sen*_*ess 5 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
}
Run Code Online (Sandbox Code Playgroud)

myObject对象是否在运行时"组合",或者scala编译器是否足够智能以在编译时生成适当的代码?如果您有多个地方正在应用上述代码中的特征,它会对代码产生什么样的性能影响?

Kev*_*ght 11

它是在编译时编写的

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

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

  • 我的补充:这是生活在单一遗产(SI)Java世界中的代价:特征必须*在*中烘焙,因为无法调整SI方法分辨率顺序(MRO).(这与Squeak ST中的特征类似,但与Ruby实际上改变MRO的特征有很大不同).这也意味着在不使用特征重新编译模块的情况下更改特征可能会导致一些相当有趣的情况......然后,同样可以为普通类辩护. (2认同)

jsu*_*eth 6

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

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

除此之外,这是一个很棒的便利功能!