2017-02-26 1 views
1

J'essaye de 'implémenter' l'interface Java suivante de JGroups avec reify. Dans ce cas, la méthode de réception est présente deux fois, avec un paramètre chacun (et différents types, bien sûr). Lorsque je tente de reify avec le code suivant dans CIDRE:Comment réifier des interfaces Java avec une méthode surchargée?

(reify org.jgroups.MessageListener (receive[#^org.jgroups.Message msg] 
            (println msg))) 

Je reçois un message d'erreur:

CompilerException java.lang.IllegalArgumentException: Can't define method not in interfaces: receive, compiling:(*cider-repl clj-groups*:49:21) 

Comme receive est certainement disponible dans l'interface, je suppose que cette question est liée à la méthode surchargée et mon indice de type ne fonctionne pas. Qu'est-ce que je fais mal?

Edit: Après avoir modifié le code suivant Lees commentaire:

(reify org.jgroups.MessageListener (receive[this #^org.jgroups.Message msg]          
            (println msg))) 

le message d'erreur a changé:

CompilerException java.lang.IllegalArgumentException: Mismatched return type: receive, expected: void, had: java.lang.Object, compiling:(*cider-repl clj-groups*:80:21) 
+2

Vous devez au moins ajouter un paramètre 'this': ce msg] ...) '. – Lee

+0

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

+0

Possible duplication de [Clojure reify une interface Java avec des méthodes surchargées] (http://stackoverflow.com/questions/21000267/clojure-reify-a-java-interface-with-overloaded-methods) – mishadoff

Répondre

1

les travaux suivants lorsque vous ajoutez argument manquant this et laisser entendre les types de retour et arguments :

$ 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