Clojure gen-class 这个关键字

Clojure gen-class this keyword

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

我正在尝试在 Clojure 中实现 daredesm 的答案 here。但是,当我尝试在 运行 函数中使用 'this' 时,我得到 "java.lang.RuntimeException: Unable to resolve symbol: 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 classes,因此非常感谢任何通用的 feedback/resources。

实例方法可以采用隐式 'self' arg- 作为第一个参数。举个例子:

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

注意 this 参数 :)

同样适用于任何实例方法,例如:

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

查看 this(无双关语意)以了解有关 gen-class 的更多信息。

对于 RunnableCallable、e.t.c 等情况,也请考虑 reify,您只需要实现一个小型接口。