当您在Clojure中扩展Java类并定义与该类中的方法同名的方法时,会发生什么?

Ray*_*yne 2 clojure java-interop

我一直在阅读Programming Clojure,我在理解Stuarts主Java Interop示例时遇到了一些麻烦.他扩展了DefaultHandler,并创建了一个startElement方法,然后将该处理程序传递给XML解析器.我不明白的是,到底发生了什么.他的startElement实现是否覆盖了DefaultHandler中定义的实现?我糊涂了.我没有使用Java的经验,也没有面向对象的经验.

谢谢!

MBC*_*ook 6

我不拥有这本书,但我找到了代码,看起来你是对的.这是功能(供其他人看):

(def print-element-handler
  (proxy [DefaultHandler] [] 
   (startElement            
     [uri local qname atts] 
     (println (format "Saw element: %s" qname)))))
Run Code Online (Sandbox Code Playgroud)

你说它的作用是正确的.proxy语句创建一个新类,即此Java代码的等效项:

public class SomeNewClass extends DefaultHandler {
    public void startElement(String uri,
                     String localName,
                     String qName,
                     Attributes attributes) {
        System.out.println(*stuff*);
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,proxy语句定义了该类,并为您提供了一个实例,该实例现在保存在print-element-handler中.