【问题标题】:When you extend a Java class in Clojure and define a method of the same name as one in that class, what is happening?当您在 Clojure 中扩展一个 Java 类并定义一个与该类中同名的方法时,会发生什么?
【发布时间】:2009-07-11 01:50:14
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: clojure java-interop


    【解决方案1】:

    我不拥有这本书,但我找到了code,看来您是对的。这是功能(供其他人查看):

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

    你是对的。代理语句创建了一个新类,相当于这段 Java 代码:

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

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

    【讨论】:

    • 我选择了你的答案,因为它比我的要好,选择我自己的答案是不公平的。 :)
    【解决方案2】:

    浏览 DefaultHandler 的 Java 文档回答了我自己的问题。 http://java.sun.com/j2se/1.4.2/docs/api/org/xml/sax/helpers/DefaultHandler.html#startElement%28java.lang.String,%20java.lang.String,%20java.lang.String,%20org.xml.sax.Attributes%29

    默认情况下,什么都不做。应用程序编写者可以在子类中重写此方法,以在每个元素的开头采取特定操作(例如分配新的树节点或将输出写入文件)。

    【讨论】:

      猜你喜欢
      • 2019-09-08
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多