4

我正在编写一个需要使用 JInterface 在 Java 和 Erlang 之间进行通信的程序。我在从 Erlang 进程接收列表时遇到问题——不知何故,我在 Java 中得到的对象不是 OtpErlangList 而是 OtpErlangString,如果我尝试将接收到的对象强制转换为 OtpErlangList,则会出现强制转换异常。我试过解码字符串,但似乎并非如此。

在我看来,无法将列表从 Erlang 发送到 Java 似乎很奇怪,如果我没有犯任何基本错误,请你看看吗?

Java片段:

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

二郎片段:

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

我省略了其余的代码,因为我相信这些是问题所在 - 我已经尝试过其他类并且它有效。

4

3 回答 3

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 端总是被解释为字符串。

于 2016-01-18T02:39:36.187 回答
2

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()返回包含所有列表元素的数组的方法。这样,数组的每个元素都是 type 的对象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
}
于 2016-01-18T09:31:29.767 回答
0

感谢 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);
                }
            }
于 2016-01-18T09:35:03.640 回答