如何使用重载方法具体化 Java 接口?
How to reify Java Interfaces with overloaded method?
我正在尝试 'implement' 来自 JGroups 的以下 Java 界面与 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) {}
}
}
}
在这种情况下,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
在接口中肯定是可用的,我假设这个问题与重载方法有关,我的typ提示不起作用。我做错了什么?
编辑:根据 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)
当您添加缺少的 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
我正在尝试 'implement' 来自 JGroups 的以下 Java 界面与 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) {}
}
}
}
在这种情况下,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
在接口中肯定是可用的,我假设这个问题与重载方法有关,我的typ提示不起作用。我做错了什么?
编辑:根据 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)
当您添加缺少的 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