Clojure代理Java模板

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中创建模板化对象?

2个回答

6
在Java中,它们被称为泛型,而不是模板。此外,它们使用类型擦除实现,即在编译后的字节码中没有泛型信息存在,因此EventHandler<Foobar>对象被编译为非泛型化的EventHandler实例。
话虽如此,Clojure甚至不尝试支持它们。你的Java代码转换成:
(.setOnAction btn 
  (proxy [EventHandler] []
    (handle [event]
      (println "Hello World"))))

有关语法的详细信息,请参阅代理Java 互操作性的文档。


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)

关于代理和实体化,请参考此线程
为什么在Clojure中应该使用Reify而不是代理?


这很有帮助;我一直在使用代理,没有意识到性能受损。 - user1311390

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接