1

我有一个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: Wrong number of args (2) passing to: myimpl$w-error.

我在这里做错了什么?

4

1 回答 1

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

于 2013-04-07T20:48:41.183 回答