Как улучшить интерфейс Java с помощью перегруженного метода?

Я пытаюсь "реализовать" следующий интерфейс Java из JGroups с reify,

public interface MessageListener extends StateListener {
   /**
    * Called when a message is received.
    * @param msg
    */
    void receive(Message msg);

    /** Called when a batch of messages is received */
    default void receive(MessageBatch batch) {
        for(Message msg: batch) {
            try {receive(msg);}
            catch(Throwable t) {}
        }
    }
}

В этом случае метод приема присутствует дважды, с одним параметром (и разными типами, конечно). Когда я пытаюсь reify со следующим кодом в CIDER:

(reify org.jgroups.MessageListener (receive[#^org.jgroups.Message msg] 
                                     (println msg)))

Я получаю сообщение об ошибке:

CompilerException java.lang.IllegalArgumentException: Can't define method not in interfaces: receive, compiling:(*cider-repl clj-groups*:49:21)

Как receive определенно доступен в интерфейсе, я предполагаю, что эта проблема связана с перегруженным методом, и моя подсказка не работает. Что я делаю неправильно?

Изменить: После изменения кода в соответствии с комментарием Ли:

(reify org.jgroups.MessageListener (receive[this #^org.jgroups.Message msg]                                     
                                     (println msg)))

сообщение об ошибке изменилось:

CompilerException java.lang.IllegalArgumentException: Mismatched return type: receive, expected: void, had: java.lang.Object, compiling:(*cider-repl clj-groups*:80:21)

1 ответ

Решение

Следующее работает, когда вы добавляете недостающие this Аргумент и подсказка типа return и аргумента:

$ boot -d org.jgroups/jgroups:4.0.0.Final repl

(import '(org.jgroups MessageListener Message) '(org.jgroups.util MessageBatch))
;;=> org.jgroups.util.MessageBatch

(def listener
  (reify MessageListener
    (^void receive [this ^Message msg] (println "Message"))
    (^void receive [this ^MessageBatch batch] (println "MessageBatch"))))
;;=> #'boot.user/listener

(.receive listener (Message.))
;; Message
;;=> nil

(.receive listener (MessageBatch. 0))
;; MessageBatch
;;=> nil
Другие вопросы по тегам