2017-02-26 5 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) {} 
     } 
    } 
} 

この場合、受信方法は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) 
+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)/question/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 
関連する問題