簡體   English   中英

當Clojure對帶有重載方法的接口生成類時,會發生ArityException

[英]ArityException occurs when clojure gen-class an interface with overloaded methods

我有一個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:傳遞給:myimpl $ w-error的args(2)數目錯誤。

我在這里做錯了什么?

以下代碼恰好是對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等動態加載代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM