为什么scala在编译后生成了太多的类文件?

irf*_*han 0 scala

我在Scala项目中工作,在编写和编译Scala代码之后,我在目标文件夹中看到了几个类文件.我很想知道它为什么会创建太多的类文件?有什么具体原因吗?

Odo*_*ois 9

Scala编译器肯定会创建许多额外的模块,以使其成为jvm表示的方式.例如,在版本2.11中,它创建:

  1. .class每个lambda表达式的A.
  2. A .class和每个objectpackage object
  3. A .class为每个trait实现的方法
  4. .class每个专业化的A ,例如

    class Foo[@specialized(Long, Double) A, @specialized(Long, Double) B]
    
    Run Code Online (Sandbox Code Playgroud)

    它将为所有(Long, Double, AnyRef)x (Long Double, AnyRef)组合创建3*3 = 9个不同的类.

但这些问题肯定是在解决这些问题.

jdk 8由于SAMlambda表示和接口默认方法,Scala 2.12在交换要求时会丢弃1和3开销.

Dotty的Linker具有自动专业化功能,它只会为您的代码生成所需的专业化,并且可以大大减少4的麻烦.