在Clojure中,如何使用存储在变量中的
java类?
如何修复以下代码?
(def a java.lang.String) (new a "1"); CompilerException java.lang.IllegalArgumentException: Unable to resolve classname: a
为什么这个工作正常?
(def a str) (a "1")
解决方法
最优雅的解决方案是编写与new相同但能够动态接收类的构造:
(defn construct [klass & args] (clojure.lang.Reflector/invokeConstructor klass (into-array Object args))) (def a HashSet) (construct HashSet '(1 2 3)); It works!!!
特别感谢@Michał Marczyk,让我知道invokeConstructor回答我的另一个问题:Clojure: how to create a record inside a function?.
另一种选择是将作为匿名函数的调用存储到构造函数中.在我们的情况下
(def a #(String. %1)) (a "111"); "111"