如何在Clojure中使用重载方法代理Java类?

Ale*_*ler 12 java proxy clojure

例如,给定一个Java类,如:

public class Foo {
  public String bar(String x) {
    return "string " + x;
  }
  public String bar(Integer x) {
    return "integer " + x;
  }
}
Run Code Online (Sandbox Code Playgroud)

我如何在Clojure中子类化Foo并仅覆盖bar(String)方法,但重用原始Foo类中的bar(Integer).像这样的东西(但这不起作用):

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

这个例子将打印:

with string:   my abc 
with integer:  my 10
Run Code Online (Sandbox Code Playgroud)

但我希望得到以下效果:

with string:   my abc 
with integer:  integer 10
Run Code Online (Sandbox Code Playgroud)

Jon*_*ran 4

我猜这不是您的意思,但与此同时,您可以显式检查参数的类型并用于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)))
Run Code Online (Sandbox Code Playgroud)