日曜プログラミング

休日趣味でやってるプログラミング関連記事をダラダラと

Clojure で可変引数を取る Java メソッドを呼び出す場合の注意点

Clojure の可変引数だとこんな感じで定義できて、

(defn my-max [& x]
  ; 処理割愛
  )

こんな感じで使える。

(max 2 3)
(max 2 3 0)
(max 2 3 4 6 0)

Java でも 1.5 から可変引数を使えるようになっており、

  void Max(Integer... args) {
    // クラス & 処理割愛
  }

みたいな感じで型指定に続き ... と書いた後の引数は可変引数となり、

  method(2, 3);
  method(2, 3, 0);
  method(2, 3, 4, 6, 0);

と使うことができる。

ただ、Clojure 側から Java のメソッドを呼び出す時はちょっと異なり、引数には Java の配列として渡してやる必要がある。なので、上記例での Max メソッドが Integer のスタティックメソッドとした場合、Clojure 側では to-array を使ってこんな感じで変換してやる。

(Integer/Max (to-array [2 3 4 6 0]))

元々は以下の記事からのネタで、Clojure の format 関数は Java の String.format スタティック
メソッドのラッパで source を見ると同様に定義してある。
proxy - Implement a Java interface method with a variable number of args in Clojure - Stack Overflow