我绝对对 Scala 类型推理引擎感到非常兴奋,但在现实世界的环境中:
它有多大的性能回退?
何时推断类型,在编译时还是运行时?
Scala 精巧而强大的类型仅在编译期间存在(*):它们从源代码(您提供它们的位置)解析、推断、检查,然后最终被丢弃。最后一个可能听起来很荒谬,但它是 JVM 的操作方式(请参阅类型擦除),从语言设计者的角度来看非常有用。
因此,要回答您的问题:在运行时,类型是显式给出还是推断出来没有区别,唯一的区别在于编译程序需要多长时间。
(*) 2.10 版本将附带一个反射库,允许程序在运行时访问其类型信息;这增加了自由度——如果使用它,当然会在运行时消耗 CPU 周期——但不会改变上述任何一点。
它有多大的性能回退?
运行时性能通常被认为可以与 Java 相媲美。由于编译器的复杂性,编译时间通常比 Java 更长。
何时推断类型,在编译时还是运行时?
在编译时。
在大约 8:50 到 12:50 的这段视频中,Martin 谈到了在“现实世界”环境中的使用和性能。他指出,有许多公司使用 Scala,从小型初创公司到大型企业。
Martin Odersky 在这个答案中提到了这一点:为什么 IntelliJ IDEA 编译 Scala 这么慢?“类型推断的成本很高,尤其是在涉及隐式搜索的情况下。”
问题是 Scala 中的编译时间比 Java 长的问题来自哪里。我很难说,因为我不是编译器构造专家。我能说的是,类型推断在 Kotlin 中显然并不昂贵,在 Groovy2.0 中也没有。让 Scala 变慢的一定是其他东西,比如搜索隐式。