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

이 경우 수신 방법은 각 매개 변수 하나 (물론 다른 유형)로 두 번 나타납니다. 내가 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)/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