jvm Scala -“companion包含自己的main方法,这意味着不能生成静态转发器”的含义

jum4pzuy  于 2022-11-07  发布在  Scala
关注(0)|答案(2)|浏览(95)

给定以下类及其伴随对象:

class B extends A

object B extends B

其中,A是另一个文件中的抽象类:

abstract class A { 
    def main(args: Array[String]): Unit = println("hey")
}

上面的代码使用sbt汇编插件打包到一个uber-jar中,其中的入口点是从class B继承的object B main方法。
上面的工作很好。它运行。完全没有问题。
然而,sbt不断警告:

[warn] B has the main method with parameter type Array[String], but B will not be a runnable program.
[warn]   Reason: companion contains its own main method, which means no static forwarder can be generated.
[warn] object B extends B

1.你知道这个警告的意思吗?
1.为什么sbt保证object B不会运行,不会发生?

  • 谢谢-谢谢
dwthyt8l

dwthyt8l1#

它不适合我。
我有这个文件B.scala

package foo.bar

abstract class A {
    def main(args: Array[String]): Unit = println("hey")
}

class B extends A

object B extends B

当我尝试运行foo.bar.B时,出现错误:

sbt> runMain foo.bar.B
[info] running foo.bar.B
[error] (run-main-0) java.lang.NoSuchMethodException: foo.bar.B.main is not static

B包含一个从类A继承的非静态主方法。在一个类中不能有两个名称和类型签名完全相同的方法,即使一个是静态的,另一个是非静态的。这意味着编译器不能在class中生成静态main方法B,它转发到objectB中的非静态主方法。

我不知道为什么它对你来说运行正确。
要避免这个问题并不难,只是不要将伴随对象作为入口点,也就是说,重命名类B或对象B

package foo.bar

abstract class A {
    def main(args: Array[String]): Unit = println("hey")
}

class BClass extends A

object B extends BClass
col17t5w

col17t5w2#

对于一个java中可运行的类,main需要是静态的。你的不是,所以,对象是不可运行的。这就是编译器告诉你的。
只需将A中的main重命名为其他名称,然后在调用它的对象中添加一个main

相关问题