Scala:定义'java'可以使用的主要方法

时间:2009-11-15 14:52:03

标签: scala

Scala中定义main的常用方法(如下所示)可用于运行带有'scala'的类,但不能运行'java'(因为创建的方法不是静态的)。如何编写可以用'java'执行的Scala类/对象?

object HelloWorld {
  def main(args: Array[String]) {
    println("Hello, world!")
  }
}

4 个答案:

答案 0 :(得分:7)

javap实际上会告诉你你的主要是静态的。

javap HelloWorld
Compiled from "HelloWorld.scala"
public final class HelloWorld extends java.lang.Object{
    public static final void main(java.lang.String[]);
    public static final int $tag()  throws java.rmi.RemoteException;
}

也许您只需要在类路径上使用Scala jar?

Stack Overflow上有一个类似的问题:“Creating a jar file from a Scala file”。

我刚刚验证了这项工作与上面的说明(链接)。

直接通过:

java -jar HelloWorld.jar

答案 1 :(得分:7)

你错了。你可以用“java”运行它,你给出的不可能的原因是不正确的。在这里,让我展示“scala”里面的内容。

Unix的:

#!/bin/sh
...
exec "${JAVACMD:=java}" $JAVA_OPTS -cp "$TOOL_CLASSPATH" -Dscala.home="$SCALA_HOME" -Denv.classpath="$CLASSPATH" -Denv.emacs="$EMACS"  scala.tools.nsc.MainGenericRunner  "$@"

视窗:

@echo off
...
if "%_JAVACMD%"=="" set _JAVACMD=java
...
"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" scala.tools.nsc.MainGenericRunner  %_ARGS%

然而,如果您碰巧有一个定义了相同名称的类,那么可能会有一个可能影响您的错误,具体取决于您使用的Scala版本。

答案 2 :(得分:3)

最简单的方法,也就是我经常使用的方法,是定义对象(就像你做的那样),但是不是相应的“伴侣”类。在这种情况下,Scala编译器将创建一对类,其名称与对象完全相同的类将包含静态转发方法,出于启动器入口点的目的,这些方法正是您所需要的。另一个类具有附加$的对象的名称,这是代码所在的位置。如果你对细节感到好奇,Javap会透露这些事情。

因此,您的HelloWorld示例将按您的意愿运行,允许:

% scala pkg.package.more.HelloWorld args that you will ignore

兰德尔舒尔茨

答案 3 :(得分:0)

你碰巧也定义了class HelloWorld吗? Scala 2.7.x中存在一个错误,它会在HelloWorldobject HelloWorld定义时阻止class HelloWorld类上的静态方法生成。