java - 申请Java构造函数

标签 java clojure

我有一个值 vector ,例如 [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))

最佳答案

如果您不介意支付反射成本,我认为 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])

关于java - 申请Java构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26212769/

相关文章:

java - 如何在 Netbeans 中与用户维护一个空的 Java EE 企业应用程序项目?

logging - Emacs clojure repl 不显示任何错误或异常

Java-将数据写入并保存到txt文件

java - 如何在 Selenium 中使用 CSS 选择器找到 TinyMCE 编辑器的主体?

java - 什么是NullPointerException,我该如何解决?

clojure - Ring 和 Pedestal 之间有什么关系 - 我是否需要了解 Ring 才能使用 Pedestal?

clojure - clj-pdf 中的模板

clojure - 如何调整 next.jdbc 中的 IReduceInit 以使用 cheshire 将 JSON 流式传输到使用 Ring 的 HTTP 响应

clojure - 为什么 miniKanren 名称总是以 `o` 结尾?

Java indexOf 函数比 Rabin-Karp 更高效?文本搜索效率