Main Content

将数据传递给 Java 方法

MATLAB 类型到 Java 类型的映射

当您将 MATLAB® 数据作为参量传递给 Java® 方法时,MATLAB 会将数据转换为最适合在 Java 语言中表达该数据的类型。有关将数据传递给 java.lang 类型的参量时的类型映射的信息,请参阅传递 Java 对象

下表中的每行显示一种 MATLAB 类型,后跟可能的 Java 参量匹配项,其接近度从左至右递减。MATLAB 类型(元胞数组除外)可以是标量(1×1)数组或矩阵。Java 类型可以是标量值或数组。

MATLAB 参量

Java 参数类型(标量或数组)
对象之外的类型

最接近的类型 <———————————————————————> 最不接近的类型

logical

boolean

byte

short

int

long

float

double

double

double

float

long

int

short

byte

boolean

single

float

double

     

uint8
int8

byte

short

int

long

float

double

 

uint16
int16

short

int

long

float

double

  

uint32
int32

int

long

float

double

   

uint64
int64

long

float

double

    

string 标量、
字符向量、
char 标量

String

      

string 数组、
字符向量元胞数组
请参阅传递字符串参量

String[]

      

jClass 类型的 Java 对象

jClass 类型的 Java Object

jClass 的任何超类

     

对象元胞数组

Object[]

      

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 使用以下转换:

  • intshortbyte 参数值转换为 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.lang 包中的 Java Object

logical

Boolean

double

Double

single

Float

char 标量

Character

string 标量
非空 char 向量

String

uint8
int8

Byte

uint16
int16

Short

uint32
int32

Integer

uint64
int64

Long

string 数组(非标量)
字符向量元胞数组

String[]

Java 对象

参量不变

元胞数组

Object[]

MATLAB 对象

不支持

传递对象数组

要调用其中某个参量定义为 java.lang.Objectjava.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)Java String 对象。

  • 对于所有其他情况,MATLAB 会将空数组转换为 Java null

空(长度为 0)Java 数组保持不变。

MATLAB 将字符串中的 <missing> 值转换为 null

重载的方法

对 Java 对象调用重载的方法时,MATLAB 会将您传递的参量与针对方法定义的参量进行比较。在此类情形中,术语方法包含构造函数。MATLAB 会根据 Java 转换规则确定调用方法并将参量转换为 Java 类型。有关详细信息,请参阅传递对象数组

当您调用 Java 方法时,MATLAB 确保:

  1. 对象或类(对于静态方法)具有按该名称命名的方法。

  2. 该调用传递至少一个具有该名称的方法的相同数量的参量。

  3. 每个传递的参量都转换为针对该方法定义的 Java 类型。

如果所有这些条件均满足,则 MATLAB 会调用该方法。

在对重载的方法的调用中,如果有多个候选方法,MATLAB 将选择其参量最适合调用参量的方法。首先,MATLAB 会拒绝其参量类型与所传递参量不兼容的方法。例如,如果该方法具有 double 参量,则 char 参量不兼容。

然后,MATLAB 选择具有最高契合值(该方法的所有参量的契合值之和)的方法。每个参量的契合值等于基类型的契合度减去 MATLAB 数组维度与 Java 数组维度的差值。有关数组维度的信息,请参阅数组维度如何影响转换。如果两个方法具有相同的契合度,则会选择在 Java 类中定义的第一个方法。

相关主题