Отправить список из Erlang в Java, используя JInterface

Я пишу программу, требующую взаимодействия между Java и Erlang, используя JInterface. У меня проблема с получением списка от процесса Erlang - каким-то образом объект, который я получаю в Java, - это не OtpErlangList, а OtpErlangString, и если я пытаюсь привести полученный объект к OtpErlangList, я получаю исключение приведения. Я пытался расшифровать строку, но, похоже, это не так.

Мне кажется довольно странным, что я не могу отправить список из Erlang на Java, не могли бы вы взглянуть, если я не совершаю какой-либо основной ошибки?

Фрагмент Java:

OtpErlangObject erlangObject = mailbox.receive();
OtpErlangList erlangList = (OtpErlangList) erlangObject;
System.out.println(erlangList.toString());

Erlang фрагмент:

List = [1, 2, 3, 4],
JavaPid ! List

Я опускаю оставшуюся часть кода, так как считаю, что это строки, в которых проблема - я пробовал это с другими классами, и это сработало.

3 ответа

Решение

Из документации Jinterface:

Списки в Erlang также используются для описания последовательностей печатных символов (строк). Удобный класс OtpErlangString предоставляется для представления строк Erlang.

Получение строки

Для получения строки печатных символов на стороне Java, вы должны использовать stringValue() метод, который преобразует список целых чисел в строку Unicode и возвращает java.lang.String объект.

Эрланг сторона:

List = "hey" = [$h, $e, $y] = [104, 101, 121],
JavaPid ! List

Java сторона:

OtpErlangObject erlangObject = mailbox.receive();
OtpErlangList erlangList = (OtpErlangList) erlangObject;
System.out.println(erlangList.stringValue());

Получение массива

Для получения списка элементов на стороне Java, вы должны использовать elements() метод, который возвращает массив, содержащий все элементы списка. Таким образом, каждый элемент массива является объектом типа OtpErlangObject,

Эрланг сторона:

List = [1, 2, 3, 4],
JavaPid ! List

Java сторона:

OtpErlangObject erlangObject = mailbox.receive();
OtpErlangList erlangList = (OtpErlangList) erlangObject;    
for(OtpErlangObject element : erlangList.elements()) {
    // do something with element
}

В erlang строка - это просто массив маленьких целых чисел. Например, в оболочке erlang,

1> A = "abcdefgh".
"abcdefgh"
2> A ++ [1024].
[97,98,99,100,101,102,103,104,1024]
3> A ++ [105].
"abcdefghi"

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

Благодаря примеру JJ Hakala, ответ таков: если вы отправляете список, содержащий только целые числа, которые могут быть интерпретированы как коды ASCII, Java делает именно это - интерпретирует его как массив кодов ASCII, он же строка:

            OtpErlangObject erlangObject = mailbox.receive();

            if (erlangObject instanceof OtpErlangString) {
                OtpErlangString string = (OtpErlangString) erlangObject;
                for(char c: string.stringValue().toCharArray()) {
                    int num = (int) c;
                    System.out.println(num);
                }
            }
Другие вопросы по тегам