Как я могу проксировать класс Java с перегруженными методами в Clojure?
Например, учитывая класс Java, например:
public class Foo {
public String bar(String x) {
return "string " + x;
}
public String bar(Integer x) {
return "integer " + x;
}
}
Как я могу подклассировать Foo в Clojure и переопределить только метод bar (String), но повторно использовать панель (Integer) из исходного класса Foo. Что-то вроде этого (но это не сработает):
(let [myFoo (proxy [Foo] []
(bar [^String x] (str "my " x)))]
(println "with string: " (.bar myFoo "abc"))
(println "with integer: " (.bar myFoo 10)))
В этом примере будет напечатан:
with string: my abc
with integer: my 10
но я хотел бы получить эффект:
with string: my abc
with integer: integer 10
Ответы
Ответ 1
Я предполагаю, что это не то, что вы имели в виду, но тем временем вы можете явно проверить тип аргумента и использовать proxy-super
вызвать исходный метод на 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)))