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 gen使用重载方法初始化接口时,会发生ArityException_Clojure - Fatal编程技术网

当clojure gen使用重载方法初始化接口时,会发生ArityException

当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 ) (

我有一个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
 )


(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
等动态加载代码