使用重载的相同方法创建抽象 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
时会有所帮助。)
是否可以像这样代理 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
时会有所帮助。)