如何在嵌套对象中调用main方法?

时间:2018-12-05 18:36:05

标签: scala

以下代码在对象AA.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。是吗?如果是这样,是否有理由实施?

2 个答案:

答案 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