Clojure gen-class это ключевое слово

Можно ли ссылаться на ключевое слово this в Java из метода gen-класса?

Я пытаюсь реализовать ответ Даредесма здесь, в Clojure. Однако, когда я пытаюсь использовать "this" в функции run, я получаю "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"))

Примечание: это мой первый раз, когда я генерирую Java-классы в Clojure, поэтому любые отзывы и пожелания приветствуются.

1 ответ

Решение

Методы экземпляра могут принимать неявный аргумент self как первый аргумент. Итак, чтобы взять ваш пример:

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

Обратите внимание this аргумент:)

То же самое касается любого метода экземпляра, например:

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

Посмотрите на это (не каламбур) для получения дополнительной информации о gen-class.

Также рассмотрим reify для таких случаев, как Runnable, Callableи т. д., где вам просто нужно реализовать интерфейс с небольшим количеством элементов.

Другие вопросы по тегам