【问题标题】:Clojure Proxy Java TemplatesClojure 代理 Java 模板
【发布时间】:2012-06-20 23:36:51
【问题描述】:

上下文

我有这段 Java 代码

    btn.setOnAction(new EventHandler<ActionEvent>() {

        public void handle(ActionEvent event) {
            System.out.println("Hello World");
        }
    });

我想把它转换成 Clojure。

我知道的

(. btn setOnAction (proxy .... ????? .... ))

问题:

如何在 Clojure 中处理 EventHandler 部分?我相信这是一个 Java 模板。如何在 Clojure 中创建模板对象?

【问题讨论】:

    标签: clojure


    【解决方案1】:

    在 Java 中,它们被称为 Generics,而不是模板。此外,它们是使用类型擦除实现的,即没有泛型信息in the compiled bytecode,因此EventHandler&lt;Foobar&gt; 对象被编译为非泛型EventHandler 实例。

    也就是说,Clojure 甚至没有尝试支持它们。您的 Java 代码转换为

    (.setOnAction btn 
      (proxy [EventHandler] []
        (handle [event]
          (println "Hello World"))))
    

    有关语法的更多详细信息,请参阅 proxyJava interop 上的文档。

    【讨论】:

      【解决方案2】:

      另一种方法是物化。一个例子:

      (import [javax.swing JFrame JButton])
      (import [java.awt.event  ActionListener])
      
      (def f (JFrame. "Test"))
      (def b (JButton. "OK"))
      
      (.add (.getContentPane f) b)
      (.addActionListener b
         (reify ActionListener
            (actionPerformed [this event]
               (println "Event is " event))
       ))
      (.show f)
      

      请参阅此线程以了解代理与 reify
      Why should I use Reify instead of proxy in clojure?

      【讨论】:

      • 这是有用的;这些天我一直在使用代理,没有意识到性能下降。
      猜你喜欢
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-12
      • 2014-05-07
      • 1970-01-01
      • 2013-06-18
      相关资源
      最近更新 更多