3

语境

我有这段 Java 代码

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

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

我想把它转换成 Clojure。

我知道的

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

问题:

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

4

2 回答 2

6

在 Java 中,它们被称为泛型,而不是模板。此外,它们是使用类型擦除实现的,即编译后的字节码中没有通用信息,因此EventHandler<Foobar>对象被编译为非通用EventHandler实例。

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

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

有关语法的更多详细信息,请参阅proxy有关Java 互操作的文档。

于 2012-06-20T13:44:15.060 回答
0

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

(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
为什么我应该在 clojure 中使用 Reify 而不是代理?

于 2012-06-20T15:18:13.180 回答