我有一个java界面如下:
public interface Wrapper {
void error( Exception e);
void error( String str);
}
我正在尝试用gen-class创建一个clojure实现:
(ns myimpl)
(gen-class
:name myimpl
:implements [Wrapper]
:state state
:init init
:prefix "w-"
:main false
)
(defn- w-error [this ^Exception e]
(println e))
(defn- w-error [this ^String s]
(println s))
然后我尝试创建一个实例并在repl中调用该方法:
> (def w (myimpl. ))
> (.error w "oops")
这会给我一个ArityException:错误的args(2)传递给:myimpl $ w-error。
我在这里做错了什么?
答案 0 :(得分:0)
以下代码恰好是对Clojure函数如何工作的误解。
(defn- w-error [this ^Exception e]
(println e))
(defn- w-error [this ^String s]
(println s))
使用defn
定义的“常规”函数无法在类型上进行调度 - 仅限于参数的数量。
我相信这实际上是一个有用且可行的功能,但我们必须选择多方法和协议实施,这些共同涵盖80%的类型 - 派遣需求。
我不知道为什么你会特别得到一个arity例外,但我会说它并不重要。
最后,您可能有兴趣在Java中实现Java接口,将实际功能委托给Clojure代码。这需要AOT编译您的Clojure项目,或通过RT
,Var
等动态加载代码。