【问题标题】:How to reify Java Interfaces with overloaded method?如何使用重载方法来具体化 Java 接口?
【发布时间】:2017-07-17 08:26:32
【问题描述】:

我正在尝试使用reify 从 JGroups 中“实现”以下 Java 接口。

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) {}
        }
    }
}

在这种情况下,receive 方法出现了两次,每次都有一个参数(当然还有不同的类型)。当我尝试在 CIDER 中使用以下代码 reify 时:

(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 在界面中绝对可用,我认为此问题与重载方法有关,并且我的类型提示不起作用。我做错了什么?

编辑:根据 Lees 注释更改代码后:

(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)

【问题讨论】:

标签: clojure reify


【解决方案1】:

当您添加缺少的this 参数并提示返回值和参数类型时,以下方法有效:

$ 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

【讨论】:

  • 来自 reify 上的文档:“如果您提供任何提示,则不会进行任何推断,因此对于参数和返回类型,所有提示(或 Object 的默认值)都必须正确。”
猜你喜欢
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
  • 2013-04-04
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多