JAVA - Создание экземпляра case-класса Scala

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

У меня есть java-программа, и я хочу вызвать библиотеку, написанную на scala, jar находится в пути к классам.

Основной класс 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: пакет Программа не существует

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

Спасибо


person wmebrek    schedule 16.04.2020    source источник


Ответы (1)


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

Типы Scala часто встречаются внутри значений объектов как форма пространств имен. Scala использует разделитель $ для искажения этих имен. Например, если задано 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).

person Mario Galic    schedule 16.04.2020
comment
Спасибо за ваш ответ, Intellij не может разрешить символ Program $ Config - person wmebrek; 16.04.2020
comment
Обратите внимание, что обычно в Scala вы не создаете экземпляр класса case через конструктор класса case, а скорее вызываете метод apply сопутствующего объекта. В Java это выглядело бы примерно как Program.Config$.apply(bla). - person Jörg W Mittag; 16.04.2020
comment
@ JörgWMittag Program.Config$.MODULE$.apply("foo", "bar") вроде работает. - person Mario Galic; 16.04.2020
comment
Мне удалось создать экземпляр класса case Config, обновив библиотеку и добавив пакет под именем example для объекта Program и используя Program.Config config = new Program.Config("foo", "bar"); Спасибо за полезный ответ. - person wmebrek; 16.04.2020