In My Clojure-code mi piacerebbe generare un file di classe che contenga un metodo statico (chiamato staticMethod
), che viene in seguito chiamato da un contesto statico da un programma Java.Come generare i metodi statici con la classe Gen di clojure?
ho cercato (Clojure):
(ns com.stackoverflow.clojure.testGenClass
(:gen-class
:name com.stackoverflow.clojure.TestGenClass
:prefix "java-"
:methods [
[#^{:static true} staticMethod [String String] String]
]))
(def ^:private pre "START: ")
(defn #^{:static true} java-staticMethod [this text post]
(str pre text post))
e (Java):
package com.stackoverflow.clojure;
public class TestGenClassTest {
private TestGenClassTest() {
}
public static void main(String[] args) {
TestGenClass.staticMethod("Static call from Java!", " :END");
}
}
Su https://kotka.de/blog/2010/02/gen-class_how_it_works_and_how_to_use_it.html ho letto:
Con l'aggiunta di metadati - via #^{: static true} - a una dichiarazione di metodo è anche possibile definire metodi statici.
Non importa dove ho messo il #^{:static true}
il compilatore Java dice sempre:
Non può fare un riferimento statico per il non-metodo statico staticMethod (String, String) dal tipo TestGenClass
Come definire i metodi statici in Clojure? #^{:static true}
e ^:static
significano lo stesso? Dove è documentato?
Dove esattamente hai provato a inserire i metadati? Rispondere alla tua ultima domanda è semplice: http://clojure.org/metadata –
Prima nella parte ': methods' di': gen-class' e Second nella definizione della funzione ('defn'). – Edward
OK --- se l'unico modo in cui l'hai provato è il modo in cui la tua domanda attuale afferma, quindi prova quanto segue: ': metodi [^: static [staticMethod [String String] String]]' –