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
12
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