2012-07-28 19 views
33

私はjava libをclojureにラップしていますが、可変長引数を扱う際に問題があります。言って、clojureでjava可変長引数を扱うには?

TestClass.aStaticFunction(Integer... intList){/*....*/} 

私はこの機能をclojureで呼び出すことができますか?

+0

可能重複http://stackoverflow.com/questions/9103777/implement-a-java-interface-method-with-a -variable-number-of-args-in-clojure) – Jeremy

答えて

39

Javaのvarargsはactually arraysなので、Clojureで配列を渡すことでvararg関数を呼び出すことができます。

あなたは配列に(多分、可変引数関数のClojureのの様々なを使用して)のClojureの配列を変換することができます:

(TestClass/aStaticFunction (into-array Integer [(int 1),(int 2)])) 

または

(defn a-static-function-wrapper [& args] 
    (TestClass/aStaticFunction (into-array Integer args)) 

または配列を作成し、手動でそのインデックスを設定し

(TestClass/aStaticFunction (doto (make-array Integer 3) 
           (aset 0 first-element) 
           (aset 1 second-element) 
           (aset 2 third-element))) 
+1

'Integer/TYPE'はプリミティブ配列を作成します。これはおそらくここで欲しいものではありません。 – mikera

+0

@mikera私はまた、プリミティブ配列が必要です!本当にありがとう! – qiuxiafei

5

Java可変長引数は、実際には配列を入力として必要とします。例えばのために

(TestClass/aStaticFunction (into-array Integer some-sequence-of-integers)) 
4
(TestClass/aStaticFunction (to-array '(1 2 3 4 5))) 

だから、Clojureの中で呼び出しが次のようになります

(java.util.Arrays/asList (to-array '(1 2 3 4 5))) 
([Clojureの中の引数の可変数を持つJavaインターフェースメソッドを実装]の
関連する問題