我有这段Java代码
btn.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
System.out.println("Hello World");
}
});
我想把它转换成Clojure。
(. btn setOnAction (proxy .... ????? .... ))
如何在Clojure中处理EventHandler部分?我相信这是一个Java模板。如何在Clojure中创建模板化对象?
答案 0 :(得分:6)
在Java中,它们被称为Generics,而不是模板。此外,它们是使用类型擦除实现的,即没有通用信息in the compiled bytecode,因此EventHandler<Foobar>
个对象被编译为非泛化的EventHandler
实例。
那就是说,Clojure甚至都没有尝试过支持他们。您的Java代码转换为
(.setOnAction btn
(proxy [EventHandler] []
(handle [event]
(println "Hello World"))))
有关语法的详细信息,请参阅proxy
和Java 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?