【问题标题】:Main method in ScalaScala中的主要方法
【发布时间】:2014-06-18 10:52:21
【问题描述】:

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

【问题讨论】:

  • 只有对象。在java中它是真正的静态方法main。但是 scala 中没有“静态”方法。
  • @EugeneZhulenev:这就是答案……
  • 对象不也得扩展App吗?
  • " 在所有 scala 示例中,我已经看到,主要方法是在对象中定义的。"我敢肯定这是有原因的......
  • user2327621,这是否回答了您的问题?如果没有,请告诉我您还在寻找什么。

标签: class scala main


【解决方案1】:

正如 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$,对象)的类文件确实有一个 public static void main 方法。 Scala 为对象中定义的方法生成静态方法,以便与 Java 兼容。

但是,我认为在 Scala 程序中创建 main 方法是不合时宜的。改用 App 特征;它更干净:

object Echo extends App {
  args foreach println
}

【讨论】:

【解决方案2】:

要回答您的问题,请查看以下内容: 我做了一个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类的main方法又转换为java类的main方法是不是静态的。 因此我们将无法运行程序,因为 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 中的public static void main 因此这里的main 方法可以直接由JVM 执行。

希望你能得到答案。

【讨论】:

    【解决方案3】:

    当我想在智能想法 scala 编辑器中测试我的代码时,我只需在我的类下面创建一个伴随对象并将一个 main 方法放入其中。就这样。看一个例子:

    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)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-06-02
      • 2012-02-23
      • 2019-11-07
      • 2010-12-16
      • 2017-10-26
      • 2019-06-18
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      相关资源
      最近更新 更多