数据类型:从XPath/XQuery到Java
当在XPath/XQuery表达式中调用Java函数时,函数参数的数据类型是很重要的,用来确定调用同名的多个Java类中的哪一个。
在Java中,需遵循以下规则:
•如果存在多个同名的Java方法,但每个方法都有不同数量的参数,则将选择与函数调用中参数数量最匹配的Java方法。
•XPath/XQuery的字符串、数字和布尔值数据类型(参见下方列表)会被隐式地转换为相应的Java数据类型。如果所提供的XPath/XQuery类型可以被转换为不只一个Java类型(例如,xs:integer),则将选择被调用的方法中声明的Java类型。例如,如果被调用的Java方法是fx(decimal),并且提供的XPath/XQuery数据类型是xs:integer,则xs:integer将被转换为Java的decimal数据类型。
下表列出了从XPath/XQuery的字符串、数字和布尔值类型到Java数据类型的隐式转换。
xs:string | java.lang.String |
xs:boolean | boolean(基元类型),java.lang.Boolean |
xs:integer | int, long, short, byte, float, double, 以及这些的包装类,例如java.lang.Integer |
xs:float | float(基元类型),java.lang.Float, double (基元类型) |
xs:double | double(基元类型),java.lang.Double |
xs:decimal | float(基元类型), java.lang.Float, double((基元类型),java.lang.Double |
上方列出的XML Schema数据类型的子类型(同时在XPath和XQuery中使用)也将被转换为与子类型的祖先类型对应的Java类型。
在某些情况下,可能无法根据提供的信息选择正确的Java方法。以下面这种情况为例。
•提供的参数是一个xs:untypedAtomic,值为10,打算将其用于mymethod(float)方法。
•然而,在该类中还有一个方法,采用另一个数据类型的参数:mymethod(double)。
•由于这两个方法的名称是相同的,并且提供的类型(xs:untypedAtomic)可以被正确地转换为float或double,所以xs:untypedAtomic很有可能被转换为double,而不是float。
•因此,选中的方法并不是所需的方法,可能无法生成预期的结果。要解决这一问题,您可以使用另一个名称创建一个用户定义的方法并使用该方法。
上表中没有包含的类型(例如xs:date)将不会被转换,从而产生一个错误。但是,请注意,在某些情况下,可以通过使用Java构造器来创建所需的Java类型。