use*_*621 33 program-entry-point scala class
我编写了一个Scala类并main()在其中定义了该方法.它编译了,但是当我运行它时,我得到了NoSuchMethodError:main.在我看到的所有scala示例中,main方法是在一个对象中定义的.在Java中,我们在类中定义main方法.是否可以main()在Scala类中定义或者我们是否总是需要一个对象?
Apo*_*rma 55
要回答你的问题,请看看以下内容:我创建了一个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();
}
Run Code Online (Sandbox Code Playgroud)
因此,这意味着当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[]);
}
Run Code Online (Sandbox Code Playgroud)
所以这里我们在MyScalaClass.class中得到了public static void main,因此main方法可以直接由JVM在这里执行.
我希望你得到你的答案.
Ami*_*ico 19
正如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[]);
}
Run Code Online (Sandbox Code Playgroud)
请注意,Echo类的类文件(不是Echo $,对象)确实有一个public static void main方法.Scala为对象中定义的方法生成静态方法,以便与Java兼容.
但是,我认为在Scala程序中创建一个主要方法是不合时宜的.请改用App trait; 它更清洁:
object Echo extends App {
args foreach println
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
57132 次 |
| 最近记录: |