2

是否可以从 gen-class 方法中引用 Java 的“this”关键字?

我正在尝试在 Clojure 中实现冒失鬼的答案。但是,当我尝试在 run 函数中使用 'this' 时,我得到“java.lang.RuntimeException:无法解析符号:this in this context”。

(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 类,因此非常感谢任何一般的反馈/资源。

4

1 回答 1

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 的信息。

还要考虑reifyRunnable,Callable等你只需要实现一个小的接口的情况。

于 2017-03-15T01:01:52.407 回答