当clojure gen使用重载方法初始化接口时,会发生ArityException
我有一个java接口,如下所示:当clojure gen使用重载方法初始化接口时,会发生ArityException,clojure,Clojure,我有一个java接口,如下所示: public interface Wrapper { void error( Exception e); void error( String str); } 我正在尝试使用gen类在clojure中创建一个实现: (ns myimpl) (gen-class :name myimpl :implements [Wrapper] :state state :init init :prefix "w-" :main false ) (
public interface Wrapper {
void error( Exception e);
void error( String str);
}
我正在尝试使用gen类在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:传递给myimpl$w-error的参数(2)数目错误
我在这里做错了什么?以下代码恰好是对Clojure函数如何工作的误解
(defn- w-error [this ^Exception e]
(println e))
(defn- w-error [this ^String s]
(println s))
用defn
定义的“常规”函数不能按类型分派-只能按参数数量分派
我相信这实际上是一个有用且可行的特性,但我们必须满足于多方法和协议实现,它们共同涵盖了80%的类型分派需求
我不知道为什么你会得到一个特殊的算术例外,但我想说这并不重要
最后,您可能对用Java实现Java接口感兴趣,将实际功能委托给Clojure代码。这需要AOT编译Clojure项目,或者通过RT
、Var
等动态加载代码