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) {}
}
}
}
在這種情況下,接收方法存在兩次,每個參數有一個參數(當然也有不同的類型)。當我嘗試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提示不起作用。我究竟做錯了什麼?
編輯:根據閱讀評論更改代碼後:
(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/questions/21000267/clojure-reify -a-java-interface-with-overloaded-methods) – mishadoff