5

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?

1 Answer 1

10

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)))
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.