【问题标题】:Extend java class in clojure: how to override only one of two similar methods?在clojure中扩展java类:如何只覆盖两个相似方法之一?
【发布时间】:2014-08-16 07:34:13
【问题描述】:

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

【问题讨论】:

    标签: clojure clojure-java-interop


    【解决方案1】:

    根据http://dishevelled.net/Tricky-uses-of-Clojure-gen-class-and-AOT-compilation.html:gen-class 可以通过签名来覆盖,但我找不到关于它的文档,所以我猜它可以被认为是“内部”,它可能会在未来中断。

    无论如何,假设您在包jpkg 中有您的Toto 类以及两个空类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
    

    键入提示在这里似乎没有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      相关资源
      最近更新 更多