我有以下java类。
public class Toto {
public void aMethod(A a) {
System.out.println("A " + a);
}
public void aMethod(B b) {
System.out.println("B " + b);
}
}
我想覆盖aMethod(A a)而不是aMethod(B b)。我能做到的唯一方法是:
(ns titi
(:gen-class :extends Toto
:exposes-method {aMethod parentMethod}))
(defn- -aMethod [this x]
(if (= (type x) A)
(println "ok do something here")
(.parentMethod this x)))
有更好的方法吗? (我的意思是不自己检查x的类型)。
答案 0 :(得分:1)
根据http://dishevelled.net/Tricky-uses-of-Clojure-gen-class-and-AOT-compilation.html,:gen-class
可以通过签名覆盖,但我无法找到相关文档,所以我猜它可以被视为"内部&#34 ;它可能在将来破裂。
无论如何,假设您在Toto
个包中有jpkg
个课程以及两个空课程A
和B
,这对我有用:
(ns Titi
(:import [jpkg A])
(:gen-class :extends jpkg.Toto
:exposes-method [aMethod]))
(defn- -aMethod-A [this x]
(println "clj a"))
作为以下main
命名空间:
(ns main
(:import [jpkg A B]))
(set! *warn-on-reflection* true)
(defn -main []
(. (new Titi) aMethod (new A))
(. (new Titi) aMethod (new B)))
打印:
clj a
B jpkg.B@6631f5ca
而不是:
clj a
clj a
键入提示似乎没有帮助。