Как я могу прокси-класс Java с перегруженными методами в Clojure? - PullRequest
12 голосов
/ 19 мая 2011

Например, для класса Java, например:

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

Как я могу создать подкласс Foo в Clojure и переопределить только метод bar (String), но повторно использовать bar (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 Ответ

3 голосов
/ 19 мая 2011

Полагаю, это не то, что вы имели в виду, но в то же время вы можете явно проверить тип аргумента и использовать 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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...