Clojure reify a Java interface with overloaded methods
clojure, clojure-java-interop
Solution
You're missing a parameter. The first parameter of every method implemented by `reify` is the object itself (as is the case with `defrecord`/`deftype`). So, try this:
(defn -create-message-factory
[]
(reify quickfix.MessageFactory
(create [this beginString msgType]
nil)
(create [this beginString msgType correspondingFieldID]
nil)))
Problem
I'm trying to implement the following Java interface in Clojure: ``` package quickfix; public interface MessageFactory { Message create(String beginString, String msgType); Group create(String beginString, String msgType, int correspondingFieldID); } ``` The following Clojure code is my attempt at doing this: ``` (defn -create-message-factory [] (reify quickfix.MessageFactory (create [beginString msgType] nil) (create [beginString msgType correspondingFieldID] nil))) ``` This fails to compile with the error: java.lang.IllegalArgumentException: Can't define method not in interfaces: create The documentation suggests overloaded interface methods are ok, so long as the arity is different as it is in this case: If a method is overloaded in a protocol/interface, multiple independent method definitions must be supplied. If overloaded with same arity in an interface you must specify complete hints to disambiguate - a missing hint implies Object. How can I get this working?