Clojure和JavaFX 2 - 将多个arity参数传递给JavaFX方法

Son*_*oth 5 java clojure variadic-functions clojure-java-interop javafx-2

许多JavaFx方法采用var args,例如Group,它在Java中声明为:

public Group(Node... children)
Run Code Online (Sandbox Code Playgroud)

其他例如:

public KeyFrame(Duration time, KeyValue... values)
Run Code Online (Sandbox Code Playgroud)

我已经发现了...我应该将java数组传递给方法的方法,所以我一直在做这样的事情,

(-> timeline .getKeyFrames 
  (.addAll 
    (into-array [(KeyFrame. blabla) (KeyFrame. blabla)]))`
Run Code Online (Sandbox Code Playgroud)

(into-array...)每次有一个var arg时都要这么做很烦人,当var arg是我实际传入的基类时,它会更烦人.例如

(Group. (into-array [(Circle. 100) (Rectangle. 100 100)]))
Run Code Online (Sandbox Code Playgroud)

导致类型不匹配错误.相反,我必须这样做:

(Group. (into-array Node [(Circle. 100) (Rectangle. 100 100)]))
Run Code Online (Sandbox Code Playgroud)

所以我做了这个功能:

(defn make-group [& items]
  (Group. (into-array Node items)))
Run Code Online (Sandbox Code Playgroud)

哪个适用于群组,但不能解决一般问题.

那么有没有一种解决省略号/变量问题的好方法,所以我不必为每个vararg方法创建特殊函数?这个函数的要求是它需要你想要调用的方法(例如Group),固定的args,var args,以及某种神奇的函数知道如何找到var args中元素的公共基类.

谢谢

cla*_*taq 2

您是否尝试过将参数放入向量中?我没有尝试过您提到的所有用例,但是当使用 addAll() 方法时,例如我只是将参数放入文字向量中,例如

    (.addAll (.getChildren btn-pane) [new-puzzle-pane check-box hint-btn
                                  check-btn solve-btn load-btn save-btn
                                  print-btn about-btn spacer])
Run Code Online (Sandbox Code Playgroud)