1
reify
のJGroupsから次のJavaインターフェイスを実装しようとしています。オーバーロードされたメソッドを使用して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) {}
}
}
}
この場合、受信方法は2つあり、それぞれ1つのパラメータ(もちろん異なる種類)があります。私はCIDERに次のコードでreify
にしようとすると:
(reify org.jgroups.MessageListener (receive[#^org.jgroups.Message msg]
(println msg)))
私は、エラーメッセージが出ます:receive
として
CompilerException java.lang.IllegalArgumentException: Can't define method not in interfaces: receive, compiling:(*cider-repl clj-groups*:49:21)
はインタフェースで間違いなく利用可能であるが、私はこの問題が関連していることを前提としオーバーロードされたメソッドと私のtypヒントは動作していません。私は間違って何をしていますか?
編集:リーズのコメントに応じてコードを変更した後:
(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 [このmsg] ...) '。 – Lee
http://stackoverflow.com/questions/21000267/clojure-reify-a-java-interface-with-overloaded-methods – mishadoff
[Clojureのオーバーロードされたメソッドを使用してJavaインターフェイスを再現する]の可能な複製(http://stackoverflow.com)/question/21000267/clojure-reify-a-java-interface-with-overloaded-methods) – mishadoff