JAVA - экземпляр Scala класс дела - PullRequest
3 голосов
/ 16 апреля 2020

после нескольких дней поиска мне нужна ваша помощь, чтобы решить мою проблему.

У меня есть программа java, и я хочу вызвать библиотеку, написанную в scala, банка находится в 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: пакет Программа не существует

Программа в пакете по умолчанию

Спасибо

1 Ответ

5 голосов
/ 16 апреля 2020

Scala использует искажение имени для кодирования различных Scala типов в Java пространства имен

Scala типы часто встречаются внутри значений объекта в виде формы пространства имен. Scala использует $ delimiter для искажения этих имен. Например, если object Kennel { class Dog }, то имя внутреннего класса станет Kennel$Dog.

Следовательно, попробуйте

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

РЕДАКТИРОВАТЬ: Хм ... на самом деле это кажется new Program.Config("foo", "bar") должен работать как

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).

...