4

我有一些 MATLAB 代码和一些 Java 代码需要相互通信。我得到一个NoSuchMethodError. 当我将 MATLAB 双精度数组传递给接受double[]参数的 Java 方法时。

所以我写了一个简单的“hello world”来获取传递给方法的对象的类

public void printArray(Object array) {

        System.out.println(array.getClass());
        System.out.println(array.getClass().getPackage());
    }

从 MATLAB 调用这个方法,我得到了这个有趣的输出:

>> a.printArray(2)
class java.lang.Double
package java.lang
>> a.printArray('hello')
class java.lang.String
package java.lang
>> a.printArray(true)
class java.lang.Boolean
package java.lang
>> a.printArray([2 3 4])
class [D
null
>> a.printArray([true false])
class [Z
null

有人可以解释发生了什么。我有 MATLAB R14,Java 类是用 1.3 兼容性编译的。

4

5 回答 5

2

对我来说看起来很简单:Matlab 将数字作为 Double 实例传递给 Java,字符串作为 String 实例,布尔值作为 Boolean 实例,数组作为 Java 数组。因此,尝试将您的方法签名从 更改method(double[] blah)method(Double[] blah).

于 2009-01-21T06:17:04.223 回答
2

MATLAB 具有一组启发式方法,可将 MATLAB 数据类型转换为被调用的 Java 方法所需的类型。完整的详细信息在 MATLAB 文档中的将数据传递给 Java 方法中进行了描述。

该方法的签名 ,void printArray(Object array)并没有为 MATLAB 提供关于 Java 真正想要什么的太多信息。这就是为什么您会看到多种类型,具体取决于您如何称呼它。

关于您最初的问题,我不确定为什么这对您不起作用。仔细看看Passing Built-In Types

它提供了示例 MATLAB 代码

poly = java.awt.Polygon([14 42 98 124], [55 12 -2 62], 4);

其中对应的 Java 方法具有签名

public Polygon(int xpoints[], int ypoints[], int npoints)

这与您的问题略有不同,因为它涉及整数数组而不是双精度数组,但应该以相同的方式工作。

于 2009-01-21T17:00:25.393 回答
2

我认为原始问题已由OP 更新,因此我将借此机会总结我们迄今为止的发现:

  • 我们已经确定原始问题中的示例代码会产生预期的行为。MATLAB 将数据作为原语传递给 Java,Java 对对象执行适当的自动装箱。正如Matthew Simoneau 的回复中所指出的,MATLAB 在其文档的“将数据传递给 Java 方法”部分中解释了它如何将其数据类型与 Java 数据类型相匹配。令人惊讶的是,单个 MATLAB 数据类型可能会匹配不同的 Java 数据类型,例如以该优先顺序logical匹配booleanbyteshortintlongfloatdouble, 。

  • OP最初遇到的NoSuchMethodError那个是由于使用了错误的方法引起的。这不再是问题使用double[]作为方法参数有效。

  • “奇怪的”类名([D[Z)实际上是 Java 用来描述原始类型数组的符号。API 解释了Class.getName()中的用法。

结案=)

于 2009-01-21T23:01:31.933 回答
0

显然,java 很好地接受了数组。它的 Arrays.toString() 方法无法处理该输入。我在方法签名中使用了 double[] 并在循环中打印了数组,它起作用了。然而,为什么会出现奇怪的类名仍然是一个悬而未决的问题。

于 2009-01-21T18:17:01.870 回答
0

正如其他人所说,这是预期的行为。Java 数组只是没有非常有用的字符串表示。如果您想获得数组的更有用的字符串表示形式,可以将它们包装在 List 中,例如:

Arrays.asList(new Double[] { 1.1, 2.2, 3.3 })
于 2009-01-21T18:28:58.007 回答