Comment puis-je proxy une classe Java avec des méthodes surchargées dans Clojure?


Par exemple, étant donné une classe Java comme:

public class Foo {
  public String bar(String x) {
    return "string " + x;
  }
  public String bar(Integer x) {
    return "integer " + x;
  }
}

Comment puis-je sous-classer Foo dans Clojure et remplacer uniquement la méthode bar(String) mais réutiliser la barre(Integer) de la classe Foo d'origine. Quelque chose comme ça (mais cela ne fonctionnera pas):

(let [myFoo (proxy [Foo] [] 
              (bar [^String x] (str "my " x)))]
  (println "with string:  " (.bar myFoo "abc"))
  (println "with integer: " (.bar myFoo 10)))

Cet exemple affichera:

with string:   my abc 
with integer:  my 10

Mais je voudrais obtenir l'effet de:

with string:   my abc 
with integer:  integer 10
Author: Alex Miller, 2011-05-19

1 answers

Je suppose que ce n'est pas ce que vous vouliez dire, mais en attendant, vous pouvez vérifier explicitement le type de l'argument et utiliser proxy-super pour appeler la méthode originale sur Foo.

(let [myFoo (proxy [Foo] [] 
              (bar [x]
                (if (instance? String x)
                  (str "my " x)
                  (proxy-super bar x))))]
  (println "with string:  " (.bar myFoo "abc"))
  (println "with integer: " (.bar myFoo 10)))
 3
Author: Jonathan Tran, 2011-05-19 05:37:37