是否可以在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类,因此非常感谢任何一般反馈/资源。
答案 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(无双关语)。
对于reify
,Runnable
,e.t.c这样的情况,请考虑Callable
,您只需要实现一个小型接口。