【问题标题】:create clojure proxy of abstract java class with overloaded same-arity method使用重载的相同数量方法创建抽象 java 类的 clojure 代理
【发布时间】:2020-12-30 19:47:20
【问题描述】:

是否可以代理这样的类并覆盖这两种方法?

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 类来重命名重载:

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

但如果有一个在构建中不需要 javac 的解决方案会很好

【问题讨论】:

标签: clojure clojure-java-interop


【解决方案1】:

在您的代理中包含一种方法m。不要键入提示参数。让函数在运行时检查实际参数类型并做出相应的行为。

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

【讨论】:

    猜你喜欢
    • 2011-08-28
    • 2016-07-22
    • 2021-03-13
    • 2017-12-31
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多