Clojure使用重载方法来重新定义Java接口

Dre*_*kes 5 clojure clojure-java-interop

我正在尝试在Clojure中实现以下Java接口:

package quickfix;

public interface MessageFactory {
    Message create(String beginString, String msgType);
    Group create(String beginString, String msgType, int correspondingFieldID);
}
Run Code Online (Sandbox Code Playgroud)

以下Clojure代码是我尝试这样做的:

(defn -create-message-factory 
  []
  (reify quickfix.MessageFactory
    (create [beginString msgType]
      nil)
    (create [beginString msgType correspondingFieldID]
      nil)))
Run Code Online (Sandbox Code Playgroud)

这无法编译错误:

java.lang.IllegalArgumentException:无法在接口中定义方法:create

文档提出重载接口方法都行,只要该元数是不同的,因为它是在这种情况下:

如果方法在协议/接口中过载,则必须提供多个独立的方法定义.如果在接口中重载了相同的arity,则必须指定完全提示以消除歧义 - 缺少提示意味着Object.

我怎样才能使这个工作?

xsc*_*xsc 7

你错过了一个参数.实现的每个方法的第一个参数reify是对象本身(与defrecord/ 的情况一样deftype).所以,试试这个:

(defn -create-message-factory 
  []
  (reify quickfix.MessageFactory
    (create [this beginString msgType]
      nil)
    (create [this beginString msgType correspondingFieldID]
      nil)))
Run Code Online (Sandbox Code Playgroud)