在clojure中扩展java类:如何只覆盖两个类似方法中的一个?

时间:2014-08-16 07:34:13

标签: clojure clojure-java-interop

我有以下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的类型)。

1 个答案:

答案 0 :(得分:1)

根据http://dishevelled.net/Tricky-uses-of-Clojure-gen-class-and-AOT-compilation.html:gen-class可以通过签名覆盖,但我无法找到相关文档,所以我猜它可以被视为"内部&#34 ;它可能在将来破裂。

无论如何,假设您在Toto个包中有jpkg个课程以及两个空课程AB,这对我有用:

(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

键入提示似乎没有帮助。