ClojureでJavaからvarargsメソッドと呼ばれる可変関数を宣言できますか? JavaからClojureバリデーション関数を呼び出す方法
は開発中のいくつかのコードからこの抜粋を考えてみましょう:(ns com.mydomain.expression.base
(:gen-class
:name com.mydomain.expression.Base
:methods [^:static [exprFactory [String String ?????] Object]]
)
(defn expr-factory
; worker function that is also called from Clojure
[id func & args]
(let [ex ("construction code here")]
ex))
(defn -exprFactory
; interface method called from Java
[idStr funcStr & argsArray]
(apply expr-factory idStr funcStr (seq argsArray)))
私はJavaがexprFactory
メソッドを呼び出すことができるように?????
の場所に置くことができ、それは可変引数メソッドであることを知っているものがあります:
import com.mydomain.expression.Base;
...
Object e1 = Base.exprFactory("e1", "day");
Object e2 = Base.exprFactory("e2", "length", "string");
Object e3 = Base.exprFactory("e3", "*", 4, 5);
Object sum = Base.exprFactory("sum", "+", e1, e2, e3);
これは少し明確にするために、私は私が?????
の代わりにObject
を使用して知っているにexprFactory
を変更します。
(defn -exprFactory
; interface method called from Java
[idStr funcStr argsArray]
(apply expr-factory idStr funcStr (seq argsArray)))
..butは次のように呼び出します。
import com.mydomain.expression.Base;
...
Object e1 = Base.exprFactory("e1", "day", new Object[0]));
Object e2 = Base.exprFactory("e2", "length", new Object[] { "string" }));
Object e3 = Base.exprFactory("e3", "*", new Integer[] { 4, 5 }));
Object sum = Base.exprFactory("sum", "+", new Object[] { e1, e2, e3 }));
繰り返しますが、私は非可変引数exprFactory
を呼び出すJavaで可変引数のラッパー・メソッドを書くことができる知っているが、私は」可能ならばそれを避けるのが好きです。
Object []が機能しません。 –
@andrewこれは私が試した最初のもので、Object ...を試しましたが、これはJava構文と一致します。 –
varargsは型シグネチャの配列のように見えるコンパイラのカンニングにすぎないので、これで '' String [] ''を指定できるはずです: '' [Ljava.lang.String; "' '' ????? ''の代わりに '' ???私はそれをコンパイルしようとしましたが、eclipseはvarargsを認識しません。javaクラスとgenクラスのクラスでも同じ型シグニチャを持っていても '' String [] ''を主張します。あなたはもっと運があるかもしれない – sw1nn