申请Java构造函数

时间:2014-10-06 08:51:04

标签: java clojure

我有一个值向量,比如[210 50 60],我需要用它创建Java对象。例如,我想创建Color

(Color. 210 50 60)         ; standard way
(apply Color. [210 50 60]) ; hmm... I need something like this

当然Color.不是函数,我们不能在其上使用apply。有没有一种优雅的方法来解决这个任务,或者我必须这样写:

(let [[r g b] [210 50 60]]
  (Color. r g b))

1 个答案:

答案 0 :(得分:1)

如果您不介意支付反映费用,我认为https://stackoverflow.com/a/9172515/151650是一种优雅的方式。 如果你不介意疯狂的宏:

(defn arity [c i]
  (let [args (map #(symbol (str "arg" %)) (range i))]
    `([~@args] (new ~c ~@args))))

(defmacro ->c [c]
   (let [cs (.getConstructors (resolve c))
         arities (set (map #(count (.getParameterTypes %)) cs))
         fn-arities (map #(arity c %) arities)]
     `(fn ~@fn-arities)))

(apply (->c java.awt.Color) 1 [2 3])