Когда вы определяете таким образом, вы получаете переменную, содержащую java.lang.Class
(def a java.lang.String)
(type a)
=> java.lang.Class
У вас есть 2 варианта:
A: Создайте новый экземпляр динамически, найдя конструктор Java с помощью API отражения. Обратите внимание, что, как указывает Yehonathan, вам нужно использовать класс точный , определенный в сигнатуре конструктора (подкласс не будет работать, поскольку он не найдет правильную сигнатуру):
(defn construct [klass & args]
(.newInstance
(.getConstructor klass (into-array java.lang.Class (map type args)))
(object-array args)))
(construct a "Foobar!")
=> "Foobar!"
B: Создайте, используя Java-взаимодействие Clojure, для которого потребуется eval:
(defn new-class [klass & args]
(eval `(new ~klass ~@args)))
(new-class a "Hello!")
=> "Hello!"
Обратите внимание, что метод A значительно быстрее (примерно в 60 раз быстрее на моем компьютере), я думаю, в основном потому, что он позволяет избежать накладных расходов при вызове компилятора Clojure для каждого оператора eval.