Clojure代理Java模板

时间:2012-06-20 13:29:21

标签: clojure

上下文

我有这段Java代码

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

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

我想把它转换成Clojure。

我所知道的

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

问题:

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

2 个答案:

答案 0 :(得分:6)

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

那就是说,Clojure甚至都没有尝试过支持他们。您的Java代码转换为

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

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

答案 1 :(得分: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)

请参阅此主题以获取代理与修改 Why should I use Reify instead of proxy in clojure?