2009-01-21 34 views
4

我有一些MATLAB代碼和一些需要彼此交談的Java代碼。我得到NoSuchMethodError。當我將MATLAB雙數組傳遞給接受double[]參數的Java方法時。奇怪的類從MATLAB傳遞到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兼容性編譯。

+0

好像預期的行爲...數組是原始的布爾和雙打的。你可能會描述給你NoSuchMethodError異常的代碼嗎? – 2009-01-21 08:44:13

回答

2

我認爲原來的問題已經updated by the OP,所以我要總結一下我們的機會目前的發現:

  • 我們已經確定原始問題中的示例代碼會產生預期的行爲。 MATLAB將數據作爲原語傳遞給Java,Java對對象執行相應的自動裝箱。正如在Matthew Simoneau's reply中指出的那樣,MATLAB解釋了它在其文檔的「Passing Data to a Java Method」部分中如何將其數據類型與Java數據類型相匹配。令人驚訝的是,單個MATLAB數據類型可以匹配不同的Java數據類型,例如, logical匹配boolean,byteshort,int,long,floatdouble,按照該優先順序。

  • OP最初遇到的NoSuchMethodError是由於使用了錯誤的方法造成的。這是no longer a problem使用double[]作爲方法參數。

  • 的「奇怪」的類名([D[Z)實際上是使用Java來描述基本類型數組符號。該API解釋了Class.getName()中的用法。

結案=)

2

看起來很簡單:Matlab將數字傳遞給Java作爲Double實例,字符串作爲String實例,布爾作爲布爾實例,數組作爲Java數組。因此請嘗試將您的方法簽名從method(double[] blah)更改爲method(Double[] blah)

+0

我不知道這是否確實如此......我認爲MATLAB將它們作爲原語傳遞,Java將它們自動裝箱到對象。不幸的是,自動裝箱不適用於數組。這意味着只有方法(double [] blah)才能工作。 – 2009-01-21 23:17:57

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) 

這是不是你的問題有點不同,因爲它涉及到一個int數組,而不是數組雙打,但應該一致地工作。

+0

這些鏈接已損壞。這是第一個的工作版本:http://www.mathworks.de/de/help/matlab/matlab_external/passing-data-to-a-java-method.html – sebastian 2013-10-10 14:13:44

+0

已修復。謝謝@sebastian。 – 2013-10-21 19:19:40

0

突然java接受數組相當好。它的Arrays.toString()方法無法在該輸入上工作。我在方法簽名中使用了double [],並在循環中打印了數組,並且它工作正常。然而,爲什麼這個奇怪的類別是apear,它仍然是一個懸而未決的問題。

0

正如其他人所說,這是預期的行爲。 Java數組沒有非常有用的字符串表示形式。如果你希望得到您的陣列更有用的字符串表示,你可以將它們包裝在一個列表,如:

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