Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Clojure中扩展Java接口时出错_Clojure - Fatal编程技术网

在Clojure中扩展Java接口时出错

在Clojure中扩展Java接口时出错,clojure,Clojure,我有一个基本Java接口,定义如下: 公共接口操作{ void execute(元数据var1,参数var2); } 我试图在Clojure中扩展它,但不断出现错误。将类导入我的命名空间后,我尝试使用reify,如下所示: (定义动作[动作fn] (b)具体化行动 (执行[元数据参数](操作fn元数据参数))) 但这会引发编译器非法参数异常: CompilerException java.lang.IllegalArgumentException: Can't define method n

我有一个基本Java接口,定义如下:

公共接口操作{
void execute(元数据var1,参数var2);
}
我试图在Clojure中扩展它,但不断出现错误。将类导入我的命名空间后,我尝试使用
reify
,如下所示:

(定义动作[动作fn]
(b)具体化行动
(执行[元数据参数](操作fn元数据参数)))
但这会引发编译器非法参数异常:

CompilerException java.lang.IllegalArgumentException: Can't define method not in interfaces: execute
接下来我尝试使用
proxy

(定义动作[动作fn]
(代理[行动][]
(执行[元数据参数](操作fn元数据参数)))
编译成功,并且我的编辑器(IntelliJ+草书)通过边框装饰导航到接口定义,但尝试在生成代理上调用execute失败:

(.execute(操作(fn[\uuu]“测试操作”))
抛出以下命令:

IllegalArgumentException No matching field found: execute for class
最后,我尝试使用deftype,如下所示:

它抛出与
具体化
相同的编译器错误,例如:

CompilerException java.lang.IllegalArgumentException: Can't define method not in interfaces: execute

翻阅各种博客帖子,答案似乎表明这是一个争论的问题,但我不知道如何解决它。我做错了什么???

您缺少函数中的
引用。所以你想要的是:

(defn action [action-fn]
  (reify Action
    (execute [this metadata parameter] (action-fn metadata parameter))))
显然,因为您没有使用它,所以您可以将其称为
\u
或您认为最有意义的任何名称。调用函数时,您需要以下内容:

(.execute (action action-fn) metadata parameter)

这与实现协议时略有不同。有关更多信息,请参阅。

ponzao的回答是正确的。但请注意,草书实际上可以为您填充存根:您可以编写
(具体化操作)
,然后(光标位于该表单的某个位置)选择code->Generate。。。并选择实现方法。草书将用正确的形式填写存根。目前,这仅在实现接口时有效,而不是协议。

啊,这就成功了,谢谢!包括
这个
参考消除了编译器错误,REPL中的以下代码按预期工作:
(.execute(action(fn[元数据参数](println“Test action”))nil nil)
@olivermoney,很高兴提供帮助!我没意识到,谢谢!我主要使用IntelliJ作为草书的宿主,到目前为止,大多数面向Java的菜单选项都是未知的。。。
(.execute (action action-fn) metadata parameter)