我正在编写一个程序,需要使用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
我省略了剩下的代码,因为我相信这些是问题所在的行 - 我已经尝试过其他类,并且它有效。
答案 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);
}
}