2

次の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 のタイプを自分でチェックしないことを意味します)。

4

1 に答える 1

1

http://dishevelled.net/Tricky-uses-of-Clojure-gen-class-and-AOT-compilation.htmlによると:gen-class、署名によるオーバーライドは可能ですが、それに関するドキュメントが見つからなかったので、 「内部」と見なすことができ、将来壊れる可能性があると思います。

とにかく、2つの空のクラスと一緒Totoにパッケージにクラスがあると仮定すると、これは私にとってはうまくいきます:jpkgAB

(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

代わりに、タイプヒントはここでは役に立たないようです。

于 2014-09-01T16:49:27.917 に答える