【问题标题】:Strange classes passed from MATLAB to Java从 MATLAB 传递到 Java 的奇怪类
【发布时间】:2010-10-02 15:05:09
【问题描述】:

我有一些 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 兼容性编译的。

【问题讨论】:

  • 看起来像预期的行为......数组是原始布尔值和双精度数。您能否描述一下导致 NoSuchMethodError 异常的代码?

标签: java matlab


【解决方案1】:

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

【讨论】:

  • 我不知道是否确实如此......我认为 MATLAB 将它们作为原语传递,而 Java 将它们自动装箱到对象。不幸的是,自动装箱不适用于数组。这意味着只有 method(double[] blah) 可以工作。
【解决方案2】:

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

该方法的签名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)

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

【讨论】:

【解决方案3】:

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

【讨论】:

  • 如果您可以将您的回答合并到原始问题中,而不是创建新答案,那就太好了。
【解决方案4】:

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

Arrays.asList(new Double[] { 1.1, 2.2, 3.3 })

【讨论】:

    【解决方案5】:

    我认为最初的问题是updated by the OP,所以我将借此机会总结一下我们迄今为止的发现:

    • 我们已经确定原始问题中的示例代码会产生预期的行为。 MATLAB 将数据作为原语传递给 Java,Java 对对象执行适当的自动装箱。 正如Matthew Simoneau's reply 中指出的那样,MATLAB 在“Passing Data to a Java Method”中解释了它如何将其数据类型与 Java 数据类型匹配" 其文档的部分。令人惊讶的是,单个 MATLAB 数据类型可能匹配不同的 Java 数据类型,例如logical 匹配 booleanbyteshortintlongfloatdouble,按优先顺序排列。

    • OP最初遇到的NoSuchMethodError是由于使用了错误的方法造成的。这是no longer a problem使用double[] 作为方法参数有效。

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

    结案 =)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-19
      • 1970-01-01
      • 2018-03-11
      • 2015-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多