【发布时间】:2016-04-26 10:40:50
【问题描述】:
我有一个基本的 Java 接口定义如下:
public interface Action {
void execute(Metadata var1, Parameter var2);
}
我正在尝试在 Clojure 中扩展它,但不断出错。将类导入我的命名空间后,我尝试使用reify,如下所示:
(defn action [action-fn]
(reify Action
(execute [metadata parameter] (action-fn metadata parameter))))
但这会引发编译器非法参数异常:
CompilerException java.lang.IllegalArgumentException: Can't define method not in interfaces: execute
接下来我尝试使用proxy
(defn action [action-fn]
(proxy [Action] []
(execute [metadata parameter] (action-fn metadata parameter))))
编译成功,我的编辑器(IntelliJ + Cursive)通过边框装饰导航到接口定义,但尝试在生成代理上调用执行失败:
(.execute (action (fn [_ _] "Test action")))
抛出以下内容:
IllegalArgumentException No matching field found: execute for class
最后我尝试使用 deftype 如下:
(deftype cljAction [action-fn]
Action
(execute [metadata parameter] (action-fn metadata parameter)))
引发与reify 相同的编译器错误,例如:
CompilerException java.lang.IllegalArgumentException: Can't define method not in interfaces: execute
浏览各种博客文章和 SO 答案似乎表明这是论点数量的问题,但我不知道如何解决它。我做错了什么??
【问题讨论】:
标签: clojure