当clojure gen-class是一个带有重载方法的接口时,会发生ArityException

时间:2013-03-30 20:48:36

标签: clojure

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

我在这里做错了什么?

1 个答案:

答案 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项目,或通过RTVar等动态加载代码。

相关问题