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中元素的公共基类.
谢谢
您是否尝试过将参数放入向量中?我没有尝试过您提到的所有用例,但是当使用 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)