JAVA - 实例化 Scala 案例类

wme*_*rek 3 java scala class case-class scala-java-interop

经过几天的搜索,我需要您的帮助来解决我的问题。

我有一个java程序,我想调用一个用scala编写的库,jar在类路径中。

Scala 主类:

object Program{
  def main(args: Array[String]): Unit = {
    ...
  }

  case class Config(param1, param2) {

    def parseProgramFromFiles(){}
    ...

  }

}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用实例化配置

Program.Config config = new Program.Config(param1, param2);
Run Code Online (Sandbox Code Playgroud)

我收到此错误:java:包程序不存在

程序在默认包中

谢谢

Mar*_*lic 5

Scala 使用名称修饰将各种 Scala 类型编码到 Java 命名空间中

Scala 类型通常作为命名空间的一种形式出现在对象值中。Scala 使用 $ 分隔符来处理这些名称。例如,给定object Kennel { class Dog }内部类名称将变为Kennel$Dog.

因此尝试

new Program$Config("foo", "bar");
Run Code Online (Sandbox Code Playgroud)

编辑:嗯......实际上它似乎new Program.Config("foo", "bar") 应该

javap -v Program$Config.class
Run Code Online (Sandbox Code Playgroud)

InnerClasses:
     public static #11= #10 of #2; //Config=class Program$Config of class Program
     public static #14= #13 of #2; //Config$=class Program$Config$ of class Program
Run Code Online (Sandbox Code Playgroud)

确实在我的机器上给出

package example

object Program {
  case class Config(param1: String, param2: String)
}
Run Code Online (Sandbox Code Playgroud)

然后

package example;

public class Main {
    public static void main(String[] args) {
        Program.Config config = new Program.Config("foo", "bar");
        System.out.println(config);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出Config(foo,bar)

  • 请注意,通常在 Scala 中,您不会通过案例类的构造函数来构造案例类的实例,而是通过调用伴生对象的“apply”方法来构造案例类的实例。在 Java 中,这大致类似于“Program.Config$.apply(bla)”。 (2认同)
  • @JörgWMittag `Program.Config$.MODULE$.apply("foo", "bar")` 似乎有效。 (2认同)