2014-10-17 14 views
5

W kodzie My Clojure chciałbym wygenerować plik klasy zawierający statyczną metodę (o nazwie staticMethod), która później jest wywoływana w statycznym kontekście z programu Java.Jak wygenerować wygenerować statyczne metody z klasą klasy clojure?

próbowałem (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)) 

i (Java):

package com.stackoverflow.clojure; 

public class TestGenClassTest { 

    private TestGenClassTest() { 
    } 

    public static void main(String[] args) { 
     TestGenClass.staticMethod("Static call from Java!", " :END"); 
    } 
} 

Na https://kotka.de/blog/2010/02/gen-class_how_it_works_and_how_to_use_it.html czytam:

Dodając metadane - poprzez #^{: static true} - do deklaracji metody można również zdefiniować metody statyczne.

Bez względu na to gdzie mogę umieścić #^{:static true} kompilator Javy zawsze mówi:

Nie można wykonać statyczny odniesienie do non-statycznej metody staticmethod (String, String) od rodzaju TestGenClass

Jak zdefiniować statyczne metody w Clojure? Czy #^{:static true} i ^:static oznaczają to samo? Gdzie jest to udokumentowane?

+1

Gdzie dokładnie próbowałeś umieścić metadane? Odpowiedź BTW na ostatnie pytanie jest prosta: http://clojure.org/metadata –

+0

Najpierw w ': methods'-część': gen-class' i Second w definicji funkcji ('defn'). – Edward

+1

OK --- jeśli jedynym sposobem, w jaki wypróbowałeś to jest sposób, w jaki wpisuje się twoje bieżące pytanie, spróbuj wykonać następujące czynności: ': methods [^: static [staticMethod [String String] String]]' –

Odpowiedz

9

Kiedy kotka powiedział opisanie metody deklarację, że „obviosly” oznaczało całą wektor trzymając deklarację:

:methods [^:static [staticMethod [String String] String] ] 

Taki lakoniczny sformułowanie jest niestety typowe dla dokumentacji Clojure.

Powiązane problemy