Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JAVA - Instantiate Scala case class

after few days of search, I need your help to solve my problem.

I have a java program and I want to call a library written in scala, the jar is in classpath.

Scala main class:

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

  case class Config(param1, param2) {

    def parseProgramFromFiles(){}
    ...

  }

}

I'm trying to instantiate Config using

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

I got this error: java: package Program does not exist

Program is in default package

Thank you

like image 425
wmebrek Avatar asked Apr 08 '26 16:04

wmebrek


1 Answers

Scala uses name mangling to encode various Scala types into Java namespaces

Scala types are often found inside of object values as a form of namespacing. Scala uses a $ delimiter to mangle these names. For example, given object Kennel { class Dog } the inner class name would become Kennel$Dog.

Hence try

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

EDIT: Hmm...actually it seems new Program.Config("foo", "bar") should work as

javap -v Program$Config.class

gives

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

and indeed on my machine given

package example

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

then

package example;

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

outputs Config(foo,bar).

like image 168
Mario Galic Avatar answered Apr 11 '26 05:04

Mario Galic



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!