2017-02-26 27 views
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) 
+2

您至少需要添加'this'參數:'(receive [這個msg] ...)'。 – Lee

+0

http://stackoverflow.com/questions/21000267/clojure-reify-a-java-interface-with-overloaded-methods – mishadoff

+0

可能重複[Clojure通過重載方法來實現Java接口](http://stackoverflow.com/questions/21000267/clojure-reify -a-java-interface-with-overloaded-methods) – mishadoff

回答

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