【发布时间】: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)
【问题讨论】:
-
你至少需要添加一个
this参数:(receive [this msg] ...)。 -
可能的重复和我的不同之处在于方法具有相同的参数计数并且需要类型提示。
-
感谢您的评论,@Lee。我更新了问题