Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Clojure reify a Java interface with overloaded methods

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?

like image 834
Drew Noakes Avatar asked Jan 08 '14 15:01

Drew Noakes


1 Answers

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)))
like image 185
xsc Avatar answered Nov 15 '22 09:11

xsc