Clojure gen-class这个关键字

时间:2017-03-15 00:00:39

标签: java clojure interop this gen-class

是否可以在gen-class方法中引用Java的'this'关键字?

我正在尝试在Clojure中实现daredesm的答案here。但是,当我尝试在run函数中使用'this'时,我得到“java.lang.RuntimeException:无法解析符号:在此上下文中。”

(gen-class
  :name ClipboardListener
  :extends java.lang.Thread
  :implements [java.awt.datatransfer.ClipboardOwner]
  :prefix ClipboardListener-
  :methods [[takeOwnership [Transferable] void]])

(def systemClipboard (.getSystemClipboard (java.awt.Toolkit/getDefaultToolkit)))

(defn ClipboardListener-run []
  (let [transferable (.getContents systemClipboard this)]
    (.takeOwnership transferable)))

(defn ClipboardListener-lostOwnership [clipboard trasferable] (prn "hit lost"))
(defn ClipboardListener-takeOwnership [transferable] (prn "hit take"))
(defn processClipboard [transferable clipboard] (prn "hit process"))

注意:这是我第一次在Clojure中生成Java类,因此非常感谢任何一般反馈/资源。

1 个答案:

答案 0 :(得分:3)

实例方法可以将隐含的“self”arg-作为第一个参数。所以举个例子:

(defn ClipboardListener-run [this]
  (let [transferable (.getContents systemClipboard this)]
    (.takeOwnership transferable)))

注意this参数:)

任何实例方法都是如此,例如:

(defn ClipboardListener-toString [this]
  "override Object#toString with something cool")

有关gen-class的更多信息,请查看this(无双关语)。

对于reifyRunnable,e.t.c这样的情况,请考虑Callable,您只需要实现一个小型接口。