使用JInterface从Erlang发送一个列表到Java

时间:2016-01-18 01:13:34

标签: java concurrency erlang jinterface

我正在编写一个程序,需要使用JInterface在Java和Erlang之间进行通信。 我从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 个答案:

答案 0 :(得分:2)

在erlang中,字符串只是一个小整数数组。例如在erlang shell中,

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

所以我的猜测是这种列表在Java端总是被解释为字符串。

答案 1 :(得分:2)

来自Jinterface文件:

  

Erlang中的列表也用于描述可打印字符(字符串)的序列。提供了一个便利类OtpErlangString来表示Erlang字符串。

获取字符串

要在Java端获取可打印字符串,应使用stringValue()方法将整数列表转换为Unicode字符串并返回java.lang.String个对象。

Erlang方面:

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类型的对象。

Erlang方面:

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
}

答案 2 :(得分:0)

感谢J.J.例如,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);
                }
            }