2016-12-14 5 views
1

スーパークラスのメソッドをClojureから呼び出したいとします。私は:gen-classを使ってJavaクラスを拡張しています。Clojureでgenclassを使用してJavaクラスを拡張するときにスーパークラスを呼び出す方法は?

(ns subclass.core 
    (:gen-class 
    :extends Baseclass)) 

(defn greet [] 
    "Hello from core") ; how to call super.greet()? 

(defn -main [& args] 
    (greet)) 

Javaの基底クラス

public class Baseclass { 
    public String greet() { 
     return "Hello from Baseclass"; 
    } 
} 

編集:私は、私はエラー

IllegalArgumentException No matching field found: pgreet for class Baseclass clojure.lang.Reflector.getInstanceField (Reflector.java:271) 
を取得しています

(ns subclass.core 
    (:gen-class 
    :extends Baseclass 
    :exposes-methods {greet pgreet}) 
    (:import Baseclass)) 

(defn greet [] 
    (.pgreet (Baseclass.))) 

(defn -main [& args]) 

を試してみました。しかし、私が呼び出したときに(あいさつ)リンクされている例として、

これはスーパークラスメソッドを呼び出す正しい方法ですか?

更新:入手しました。私たちは、基本クラスのメソッドを呼び出す別のメソッドを作成します。 https://en.wikibooks.org/wiki/Clojure_Programming/Examples/API_Examples/Java_Interaction#genclass
NB:それはリンクされた答えが言うものではありません。

+0

あなたのコードが重複して答えに従っていません。 '(.pgreet this)'の代わりに '(.pgreet(BaseClass。))'を使用します。 *巨大な違いがあります。 –

+0

'this' argとは何ですか?クラス「Baseclass」の対象ではありませんか?そうでなければ、 '(grep greet [this](.pgreet this))' 'greet'を呼び出すには? 'this'' argのために何を渡しますか? – boring

+0

いいえ、あなたが他の質問で与えられた答えに従えば、 'this'は' BaseClass'クラスの* subclass *のオブジェクトになります。 'BaseClass'は' pgreet'メソッドを持っていません - それは 'pgreet'メソッドを持つ' gen-class'です。 –

答えて

1

この質問はすでにaskedansweredです。

greet関数がBaseClassのインスタンスでpgreetメソッドを呼び出そうとしたため、例は失敗します。 gen-class edクラスのインスタンスを作成する必要があります。例えば

、このような何か:

(ns subclass.core 
    (:gen-class 
    :extends Baseclass 
    :exposes-methods {greet pgreet}) 
    (:import Baseclass)) 

;; You need to define a function for the overridden method 
(defn greet- [this] 
    (. this (pgreet))) 

(defn greet [] 
    ;; You need to use the *gen-class*ed class, not BaseClass 
    (. (new subclass.core) (greet)))) 
+0

私はClassNotFoundExceptionを取得しています:subclass.core。 – boring

+0

'subclass.core'名前空間を[コンパイル](https://clojuredocs.org/clojure.core/compile)しましたか?これを簡単にするために 'project:clj'に':aot'エントリを追加したいと思うでしょう。 –

+0

':aot [subclass.core]'を追加しましたが、 'lein repl'は' Baseclass'を見つけることができません。私は ':java-source-paths [" src/java "]'を持っています。それは 'ClassNotFoundException:java.lang.Baseclass'を与えています。とにかく答えてくれてありがとう。 – boring

関連する問題