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?

Original source