以下代码在对象A
和A.B
中具有主要方法。我可以从命令行调用A
。有什么方法可以调用A.B
?
object A {
def main(args : Array[String]) = ()
object B {
def main(args : Array[String]) = ()
}
}
我认为很幸福:Scala将对象A
编译为类A$
,将A.B
编译为A$B$
。这些类都不具有静态方法。 Scala使用委托给A
的静态main方法创建其他类A$.main
。但是Scala不会为A.B
编译等效类,因为编译器会使用主要方法对顶级类进行特殊处理。
如果上面的描述是正确的,那么在命令行上没有没有的方式来调用A.B
。是吗?如果是这样,是否有理由实施?
答案 0 :(得分:2)
因此,正如您所注意到的,}
最终是类object A { ... }
而不是A$
的类,它有一个A
方法,但它不是静态的。
Scala对象是单例实例,而不仅仅是带有一堆静态方法的类。
因此,为了能够从命令行运行main
,scalac会使用静态方法scala A
生成另一个类A
,该类调用main
... < / p>
这是一条特殊的额外逻辑,需要遵循jvm关于从命令行启动时如何寻找A$.MODULE$.main
的假设。
编译器仅对具有main
方法和且没有伴侣类的顶级对象执行此操作(因为如果这样做,名称将与生成的对象冲突类)。
为什么对嵌套类不这样做?我认为没有专门阻止它的某种原因(例如我上面提到的名称冲突),可能只是因为没有人要求它。
答案 1 :(得分:0)
从外面看不到内部对象 B。要调用它的 main 方法,你必须在 A 中提供一个接口,例如从它的 main 方法,这样你就可以毫不费力地传递参数:
object A {
def main(args : Array[String]) = {
println ("outer A.main")
B.main (args)
}
object B {
def main(args : Array[String]) = {
println ("inner B.main")
}
}
}
调用:
scala -howtorun:object A
outer A.main
inner B.main
测试:
scala -howtorun:object A.B
java.lang.ClassNotFoundException: A.B