当我使用scalac编译file.scala时,我最终会得到两个输出,file.class和file$.class。这些文件与运行哪个文件有什么区别?在执行"scala-file"one_answers"scala-file$"之间,我得到明显不同的错误消息。
Scala object
被编译为以"$"结尾的类,因为您可以拥有一个同名的"普通"类。但是,对象的方法也作为"普通"类上的静态方法公开,因此可以使用您期望的名称来调用它们。这是一个尝试以对Java/JVM有意义的方式表示scala语义的工件,我鼓励您将其视为实现细节,而不是重要的东西。
(@MattPutnam的答案是正确的,包括闭包在内的匿名类被编译为名称中包含$es的类文件,但在这个特定的实例中,这并不是导致文件$.class的原因)
使用scala file
。如果您对实现细节感兴趣,也可以尝试java -cp /path/to/scala-library.jar file
。
file$.class是一个内部匿名类。在Java中,它们非常明确,但在Scala中很容易被忽略。如果您使用任何接受函数的方法,就会有一个隐式匿名类。张贴代码,我会指出它。