所以,假设我有一个名为 MyFunction 的 Java 抽象类,它有一个抽象评估方法。
要在 clojure 中使用它,我可以这样做:
(def java-function
(proxy [MyJavaFunction] []
(evaluate [x]
(* x 2))))
然后用以下方式调用它:
(.evaluate java-function 3)
返回
; => 6
将上述内容转变为更 clojure 的东西有什么好方法:
(java-function 3)
这也会返回
; => 6
最佳答案
您可以通过实现 clojure.lang.IFn
接口(interface)来实现这一点:
((proxy [clojure.lang.IFn] []
(invoke [x]
(str "A very a nice x indeed: " x)))
3)
;= "A very a nice x indeed: 3"
要让您的代理子类 MyFunction
并实现 IFn
,请在 proxy 的第一个参数中提及它们;注意。类先行:
(proxy [MyFunction clojure.lang.IFn] []
...)
实际上,上面的实现并不完整 - 您还需要实现 applyTo
方法,该方法除了 this
之外还采用单个 seq 参数,并由 使用应用
。对于其他固定数量(最多 20 个),还有单独的invoke
方法。关注 this link查看 data.avl 的源代码(版本 0.0.12)以查看委托(delegate)给适当的 invoke
方法的 applyTo
实现,同时注意避免进入无限循环/采取过度的操作如果传入的 seq 恰好是无限/非常长的时间量。
关于Clojure、Java Interop 和代理方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25619698/