将数据传递给 Java 方法
MATLAB 类型到 Java 类型的映射
当您将 MATLAB® 数据作为参数传递给 Java® 方法时,MATLAB 会将数据转换为最适合在 Java 语言中表达该数据的类型。有关将数据传递给 java.lang
类型的参数时的类型映射的信息,请参阅传递 Java 对象。
下表中的每行显示一种 MATLAB 类型,后跟可能的 Java 参数匹配项,其接近度从左至右递减。MATLAB 类型(元胞数组除外)可以是标量(1×1)数组或矩阵。Java 类型可以是标量值或数组。
MATLAB 参数 | Java 参数类型(标量或数组) 最接近的类型 <———————————————————————> 最不接近的类型 | ||||||
---|---|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |||||
|
|
|
|
|
|
| |
|
|
|
|
|
| ||
|
|
|
|
| |||
|
|
|
| ||||
|
| ||||||
|
| ||||||
|
|
| |||||
对象元胞数组 |
| ||||||
MATLAB 对象 | 不支持 |
数组维度如何影响转换
维度表示数组元素寻址所需的下标数。例如,5×1 数组的维度为 1,因为您使用一个数组下标对各元素进行索引。
在将 MATLAB 转换为 Java 数组的过程中,MATLAB 以特殊方式处理维度。对于 MATLAB 数组,维度是数组中非单一维的数量。例如,10×1 数组的维度为 1,而 1×1 数组的维度为 0,因为您不能对标量值进行索引。在 Java 代码中,嵌套数组的数量决定维度。例如,double[][]
的维度为 2,double
的维度为 0。
如果 Java 数组的维数与 MATLAB 数组 n
中的维数匹配,则转换后的 Java 数组具有 n
个维度。如果 Java 数组的维数小于 n
,则转换会从第一个单一维开始丢弃单一维。当剩余维度的数量与 Java 数组中的维度数量匹配时,转换便会停止。如果 Java 数组的维度大于 n,则 MATLAB 会添加尾部单一维。
将数字转换为整数参数
将整数类型传递给采用 Java 整数参数的 Java 方法时,MATLAB 转换与 Java 转换在整数类型之间是相同的。尤其当整数超出范围时,它不会适应参数类型的位数。对于超出范围的整数,MATLAB 会丢弃所有最低的 n
位。值 n
是参数类型中的位数。此转换与 MATLAB 整数类型之间的转换不同,后者会将超出范围的整数转换为由目标类型表示的最大值或最小值。
如果参数是浮点数,MATLAB 不会像 Java 那样将其转换为整数。MATLAB 会首先将浮点数转换为 64 位有符号整数,即截断小数部分。然后将该数字视为 int64
参数进行处理。
浮点数太大(在 -263–263 范围之外)时,无法用 64 位整数表示。在这种情况下,MATLAB 使用以下转换:
将
int
、short
和byte
参数值转换为0
。将
long
参数值转换为java.lang.Long.MIN_VALUE
。将
Inf
和-Inf
值转换为-1
。将
NaN
值转换为0
。
传递字符串参数
要使用定义为 java.lang.String
的参数调用 Java 方法,请传递一个 MATLAB 字符串或字符向量。MATLAB 将该参数转换为 Java String
对象。您还可以传递由 Java 方法返回的 String
对象。
如果方法参数是 String
类型的数组,则传递字符串数组或字符向量元胞数组。MATLAB 将输入转换为 String
对象的 Java 数组,维度按数组维度如何影响转换中所述进行调整。
传递 Java 对象
要调用其中某个参数属于 Java 类(而不是 java.lang.Object
)的方法,您必须传递一个 Java 对象,此对象是该类的一个实例。MATLAB 不支持 Java 自动装箱,即 MATLAB 类型不会自动转换为 Java Object
类型。例如,对于 Double
类型的参数,MATLAB 不会将 double
转换为 java.lang.Double
。
传递 java.lang.Object
当方法接受 java.lang.Object
类的参数时,存在特例。由于此类是 Java 类层次结构的根,您可以在参数中传递任何类的对象。MATLAB 会自动将参数转换为最接近的 Java Object
类型,其中可能包含 Java 样式的自动装箱。下表显示了对应的转换。
MATLAB 参数 |
|
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Java 对象 | 参数不变 |
元胞数组 |
|
MATLAB 对象 | 不支持 |
传递对象数组
要调用其中某个参数定义为 java.lang.Object
或 java.lang.Object
数组的方法,请传递一个 Java 数组或 MATLAB 元胞数组。MATLAB 会自动将元胞数组元素转换为其 Java 类型,如传递 java.lang.Object表中所述。Java 数组是从 Java 构造函数返回的数组。您还可以使用 javaArray
函数在 MATLAB 中构造 Java 数组。
传递 Java 对象的元胞数组
要创建 Java 对象的元胞数组,请使用 MATLAB 语法 {a1,a2,...}
。您可以通过常规方式使用语法 a{m,n,...}
对 Java 对象的元胞数组进行索引。例如,创建元胞数组 A
:
a1 = java.lang.Double(100); a2 = java.lang.Float(200); A = {a1,a2}
A = 1×2 cell array [1×1 java.lang.Double] [1×1 java.lang.Float]
传递空矩阵、空值和缺失值
MATLAB 按如下方式转换空矩阵。
如果参数为空字符向量且参数声明为
String
,则 MATLAB 传入空(不是null
)JavaString
对象。对于所有其他情况,MATLAB 会将空数组转换为 Java
null
。
空(长度为 0
)Java 数组保持不变。
MATLAB 将字符串中的 <missing>
值转换为 null
。
重载的方法
对 Java 对象调用重载的方法时,MATLAB 会将您传递的参数与针对方法定义的参数进行比较。在此类情形中,术语方法包含构造函数。MATLAB 会根据 Java 转换规则确定调用方法并将参数转换为 Java 类型。有关详细信息,请参阅传递对象数组。
当您调用 Java 方法时,MATLAB 确保:
对象或类(对于静态方法)具有按该名称命名的方法。
该调用传递至少一个具有该名称的方法的相同数量的参数。
每个传递的参数都转换为针对该方法定义的 Java 类型。
如果所有这些条件均满足,则 MATLAB 会调用该方法。
在对重载的方法的调用中,如果有多个候选方法,MATLAB 将选择其参数最适合调用参数的方法。首先,MATLAB 会拒绝其参数类型与所传递参数不兼容的方法。例如,如果该方法具有 double
参数,则 char
参数不兼容。
然后,MATLAB 选择具有最高契合值(该方法的所有参数的契合值之和)的方法。每个参数的契合值等于基类型的契合度减去 MATLAB 数组维度与 Java 数组维度的差值。有关数组维度的信息,请参阅数组维度如何影响转换。如果两个方法具有相同的契合度,则会选择在 Java 类中定义的第一个方法。