在Clojure中,如何动态使用java类?

前端之家收集整理的这篇文章主要介绍了在Clojure中,如何动态使用java类?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在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!!!

解决方案克服了@mikera的答案的限制(见评论).

特别感谢@Michał Marczyk,让我知道invokeConstructor回答我的另一个问题:Clojure: how to create a record inside a function?.

另一种选择是将作为匿名函数调用存储到构造函数中.在我们的情况下

(def a #(String. %1))
(a "111"); "111"
原文链接:https://www.f2er.com/java/124000.html

猜你在找的Java相关文章