Java 如何在defprotocol中使用可选参数?

Java 如何在defprotocol中使用可选参数?,java,clojure,Java,Clojure,我想在我的类型中有一个接受可选参数的函数。我已经成功地在不属于某个类型的函数中使用了可选参数,但是,我似乎无法使它在协议和类型中工作 我失败的审判: Clojure 1.4.0 user=> (defprotocol OptArg (func [this a & b])) OptArg user=> (deftype Imp [] OptArg (func [this a & b] (println a b))) user.Imp user=> (func

我想在我的类型中有一个接受可选参数的函数。我已经成功地在不属于某个类型的函数中使用了可选参数,但是,我似乎无法使它在协议和类型中工作

我失败的审判:

Clojure 1.4.0
user=> (defprotocol OptArg
(func [this a & b]))
OptArg

user=> (deftype Imp [] OptArg
(func [this a & b] (println a b)))
user.Imp

user=> (func (Imp.) 1 2)
CompilerException java.lang.IllegalArgumentException: No single method: func of interface: user.OptArg found for function: func of protocol: OptArg, compiling:(NO_SOURCE_PATH:5) 

user=> (defn opt-arg [a & b] (println a b))
#'user/opt-arg

user=> (opt-arg 1 2)
1 (2)
nil
user=> (opt-arg 1)
1 nil
nil
user=>

如前所述,协议不支持varargs。您必须为每个所需数量的参数定义一个单独的方法,或者只接受一个列表作为参数。

我制作了一个
defprotocol+
供您使用可选参数定义协议。其思想是将
&args
作为协议中的固定参数,并自动创建包装函数

检查宏

用法

(方案+依匹灵) (运行并等待[this&args])) (记录+管道[] 伊庇林 (运行并等待[this&args] )) (运行并等待(管道)1 2 3 4 5)
谢谢。作为Clojure的初学者,我真的希望它的错误消息能有一些意义。但值得补充的是,一个好的解决方案是在协议之外创建一个支持varargs的方法,并让该函数调用协议本身中的相应函数 (defprotocol+ IPipeline (run-and-wait [this & args])) (defrecord+ Pipeline [] IPipeline (run-and-wait [this & args] )) (run-and-wait (Pipeline.) 1 2 3 4 5)