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:包程序不存在
程序在默认包中
谢谢
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)。