XPath/XQuery 条件式内部から Java 関数が呼び出された場合、複数ある同名の Java クラスのうち、どのクラスが呼び出されたのか決定するのに、関数へ渡される引数のデータ型が重要になります。
Java では、以下のルールが適用されます:
•同名の Java メソッドが2つ以上あり、それぞれが違う数の引数を受け取る場合、呼び出しに使用されている引数の数に一番マッチするメソッドが選択されます。
•XPath/XQuery の文字列、数値、boolean データ型は、黙示的に対応する Java データ型へ変換されます(以下のリストを参照)。与えられた XPath/XQuery 型が2つ以上の Java 型へ変換できる場合(例: xs:integer)、選択されたメソッドにて宣言されている Java 型が使用されます。例えば、呼び出された Java メソッドが fx(decimal) で、与えられた XPath/XQuery データ型が xs:integer の場合、 xs:integer が Java の decimal データ型へ変換されます。
以下のテーブルに、XPath/XQuery の文字列、数値、boolean 型から 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 スキーマデータ型(ならびに XPath や XQuery で使用されているデータ型)のサブタイプも、対応する祖先のサブタイプとして Java のデータ型へ変換されます。
場合によっては、与えられた情報から正しい Java メソッドを選択することができない場合もあります。例えば、以下のような場合を考えてみましょう:
•与えられた引数が 10 という値を持った xs:untypedAtomic 型で、mymethod(float) メソッドへ渡されるのを意図している。
•しかし、そのクラスには別のデータ型を取る mymethod(double) というメソッドも存在する。
•メソッド名が同じで、与えられた型 (xs:untypedAtomic) も float と double の両方に変換することができるため、xs:untypedAtomic が float ではなく double に変換される可能性もある。
•結果として、意図したメソッドは選択されず、予期しない動作結果がを招く可能性がある。この問題を回避するには、意図したメソッドを使用するユーザー定義のメソッドを別の名前で新たに作成する必要があります。
上のリストでカバーされていない型(例: xs:date)は変換されず、エラーとなります。しかし場合によっては、Java コンストラクターを使用して、目的の Java データ型を作成することが可能だということも留意してください。