2017-03-15 6 views
2

Ist es möglich, auf Java 'this' Schlüsselwort innerhalb einer gen-Klasse Methode zu verweisen?Clojure gen-class dieses Schlüsselwort

Ich versuche die Antwort von dardesm here in Clojure zu implementieren. Wenn ich jedoch versuche, 'this' in der run-Funktion zu verwenden, bekomme ich "java.lang.RuntimeException: Symbol kann nicht aufgelöst werden: dies in diesem Kontext."

(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")) 

Hinweis: Dies ist mein erstes Mal zu erzeugen Java-Klassen in Clojure, so dass jedes allgemeines Feedback/Ressourcen werden sehr geschätzt.

Antwort

3

Instanzmethoden können als erstes Argument ein implizites "self" Argument annehmen. So Ihr Beispiel zu nehmen:

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

Notiere die this Argument :)

Das Gleiche gilt für jede Instanz-Methode, zB:

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

Werfen Sie einen Blick auf this (kein Wortspiel beabsichtigt) für Weitere Informationen zur Gen-Klasse.

Denken Sie auch an reify für Fälle wie Runnable, Callable, e.t.c, wo Sie nur eine klein-ish-Schnittstelle implementieren müssen.

+0

Es sieht so aus, als ob das funktioniert. Ich hatte das schon früher in anderen Beispielen gesehen, nahm aber an, dass es explizit ein Teil der Methodensignatur in Java war, was für mich keine Option war, da ich eine existierende Methode überschrieben habe. Vielen Dank! – Porthos3

Verwandte Themen