Странные классы, переданные из MATLAB в Java - PullRequest
4 голосов
/ 21 января 2009

У меня есть немного кода MATLAB и немного кода Java, которые должны общаться друг с другом. Я получал NoSuchMethodError. Когда я передаю двойной массив MATLAB методу Java, который принимает аргумент double[].

Поэтому я пишу простой «привет мир», чтобы получить класс объекта, переданного методу

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.

Ответы [ 5 ]

2 голосов
/ 22 января 2009

Я думаю, что оригинальная проблема была обновлена ​​с помощью OP , поэтому я воспользуюсь возможностью обобщить наши выводы:

  • Мы установили, что пример кода в исходном вопросе дает ожидаемое поведение. MATLAB передает данные как примитивы в Java, а Java выполняет соответствующий автобокс для объектов. Как указано в Ответ Мэтью Симоне , MATLAB объясняет, как он сопоставляет свои типы данных с типами данных Java раздел « Передача данных в метод Java » своей документации. Удивительно, что один тип данных MATLAB может соответствовать разным типам данных Java, например, logical соответствует boolean, byte, short, int, long, float и double в указанном порядке старшинства.

  • NoSuchMethodError, с которым первоначально столкнулся OP, было вызвано использованием неправильного метода. Это больше не проблема . Использование double[] в качестве аргумента метода.

  • «Странные» имена классов ([D и [Z) на самом деле являются обозначениями, используемыми Java для описания массивов примитивных типов. API объясняет использование в Class .getName () .

Дело закрыто =)

2 голосов
/ 21 января 2009

MATLAB имеет набор эвристик для преобразования типов данных MATLAB в тип, требуемый вызываемым методом Java. Полная информация описана в Передача данных в метод Java в документации MATLAB.

Подпись метода, void printArray(Object array), не дает MATLAB много информации о том, чего действительно хочет Java. Вот почему вы видите различные типы, в зависимости от того, как вы называете это.

Что касается вашего первоначального вопроса, я не уверен, почему это не сработает для вас. Внимательно рассмотрите Передача встроенных типов .

Это дает образец кода MATLAB

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

где соответствующий метод Java имеет подпись

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

Это немного отличается от вашего вопроса, потому что оно включает массивы целых, а не массивов двойных, но должно работать одинаково.

2 голосов
/ 21 января 2009

Для меня это выглядит просто: Matlab передает числа в Java как экземпляры Double, строки как экземпляры String, логические значения как экземпляры типа Boolean и массивы как массивы Java. Поэтому попробуйте изменить сигнатуру вашего метода с method(double[] blah) на method(Double[] blah).

0 голосов
/ 21 января 2009

Как уже говорили другие, это ожидаемое поведение. Java-массивы просто не имеют очень полезного строкового представления. Если вы хотите получить более полезное строковое представление ваших массивов, вы можете поместить их в список, например:

Arrays.asList(new Double[] { 1.1, 2.2, 3.3 })
0 голосов
/ 21 января 2009

Явно java принимает массив вполне нормально. Это метод Arrays.toString (), который не работает с этим вводом. Я использовал double [] в сигнатуре метода и напечатал массив в цикле, и это работало. Однако остается открытым вопрос, почему появляются странные имена классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...