【问题标题】:JAVA - Instantiate Scala case classJAVA - 实例化 Scala 案例类
【发布时间】:2020-07-29 03:10:28
【问题描述】:

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

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

Scala 主类:

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

  case class Config(param1, param2) {

    def parseProgramFromFiles(){}
    ...

  }

}

我正在尝试使用

实例化 Config
Program.Config config = new Program.Config(param1, param2);

我收到此错误:java: package Program 不存在

程序在默认包中

谢谢

【问题讨论】:

    标签: java scala class case-class scala-java-interop


    【解决方案1】:

    Scala 使用 name mangling 将各种 Scala 类型编码到 Java 命名空间中

    Scala 类型通常在对象值中作为 命名空间。 Scala 使用 $ 分隔符来破坏这些名称。为了 例如,给定object Kennel { class Dog } 内部类名将 变成Kennel$Dog

    因此尝试

    new Program$Config("foo", "bar");
    

    编辑:嗯...实际上似乎new Program.Config("foo", "bar") should work

    javap -v Program$Config.class
    

    给予

    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
    

    确实在我的机器上给出了

    package example
    
    object Program {
      case class Config(param1: String, param2: String)
    }
    

    然后

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

    输出Config(foo,bar)

    【讨论】:

    • 感谢您的回复,Intellij 无法解析符号 Program$Config
    • 请注意,通常在 Scala 中,您不会通过案例类的构造函数来构造案例类的实例,而是通过调用伴随对象的 apply 方法。在 Java 中,这看起来大致类似于 Program.Config$.apply(bla)
    • @JörgWMittag Program.Config$.MODULE$.apply("foo", "bar") 似乎有效。
    • 我能够通过更新库并在对象 Program 的名称示例下添加包并使用 Program.Config config = new Program.Config("foo", "bar"); 来实例化案例类 Config感谢您的有用回复。
    猜你喜欢
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    相关资源
    最近更新 更多