Scala中的主要方法



我写了一个Scala类,并在其中定义了main()方法。它进行了编译,但当我运行它时,我得到了NoSuchMethodError:main。在我看到的所有scala示例中,主方法都是在对象中定义的。在Java中,我们定义了类中的主方法。有可能在Scala类中定义main()吗?还是我们总是需要一个对象?

要回答您的问题,请查看以下内容:我制作了一个scala类,对它进行了编译和反编译,得到的东西很有趣。

class MyScalaClass{
   def main(args: Array[String]): Unit = {
         println("Hello from main of class")
   }
}
Compiled from "MyScalaClass.scala"
public class MyScalaClass {
      public void main(java.lang.String[]);
      public MyScalaClass();
}

因此,这意味着当scala类转换为java类时,scala类的主方法是,而不是静态。因此,我们将无法运行程序,因为JVM无法在程序中找到起点。

但是,如果使用'object'关键字完成相同的代码,则:

Compiling the following:
object MyScalaClass{
 def main(args: Array[String]): Unit = {
  println("Hello from main of object")
 }
}
Decompiling the following:
javap MyScalaClass$.class
Compiled from "MyScalaClass.scala"
public final class MyScalaClass$ {
 public static final MyScalaClass$ MODULE$;
 public static {};
 public void main(java.lang.String[]);
}
Decompiling the following
javap MyScalaClass.class
Compiled from "MyScalaClass.scala"
public final class MyScalaClass {
  public static void main(java.lang.String[]);
}

因此,我们在MyScalaClass.class中得到了公共静态void main,因此main方法可以由JVM直接执行。

我希望你能得到答案。

正如Eugene在评论中所说,Scala中没有静态方法。但请注意:

$ cat Echo.scala
object Echo {
  def main( args:Array[String] ):Unit = args foreach println
}
$ scalac Echo.scala
$ javap Echo$.class
Compiled from "Echo.scala"
public final class Echo$ {
  public static final Echo$ MODULE$;
  public static {};
  public void main(java.lang.String[]);
}
$ javap Echo.class
Compiled from "Echo.scala"
public final class Echo {
  public static void main(java.lang.String[]);
}

请注意,Echo类的类文件(而不是对象Echo$(确实有一个公共的静态void main方法。Scala为与Java兼容的对象中定义的方法生成静态方法。

然而,我认为在Scala程序中创建主方法是一个时代错误。改为使用应用程序特征;它更清洁:

object Echo extends App {
  args foreach println
}

当我想在智能思想scala编辑器中测试我的代码时,我只需在类的下面创建一个伴随对象,并在其中放入一个主方法。仅此而已。参见示例:

class Colon {
    class Cow {
        def ^ (moon:Moon): Unit ={
        println("Cow jumped over the moon")
        }
    }
    class Moon{
        def ^:(cow:Cow) = println("This cow jumped over moon too")
    }
}
object Colon{
    def main(args: Array[String]): Unit = {
    val c:Colon = new Colon
    val cow = new c.Cow
    val moon = new c.Moon
    cow ^ moon
    cow ^: moon
    moon.^:(cow)
    }
}

相关内容

  • 没有找到相关文章

最新更新