使用重载的相同方法创建抽象 java class 的 clojure 代理

create clojure proxy of abstract java class with overloaded same-arity method

是否可以像这样代理 class 并重写这两种方法?

public abstract class C {
  ...
  public abstract void m(String a);
  public void m(Integer a) {}
}

这行不通:

(proxy [C] []
  (m [^String a])
  (m [^Integer a]))

;; java.lang.IllegalArgumentException: Method 'm' redefined

我目前的解决方法是编写一个代理友好的 java class 来重命名重载:

public abstract class C2 extends C {
  @Override
  public void m(Integer a) { this.m2(a); }
  public abstract void m2(Integer a);
}

但是如果有一个在构建中不需要 javac 的解决方案就更好了

在您的代理中包含一种方法 m。不要type-hint参数。让函数检查 run-time 处的实际参数类型并相应地进行操作。

(如果所讨论的方法的数量不同,您需要将代理方法参数列表声明为 [ & x],即接收所有参数,无论它们可能有多少,作为向量。此技术例如,当你想代理 java.io.Writer 时会有所帮助。)