6

clojureからwekaを使用しようとすると、clojureのjava相互運用機能を使用して、このハウツーガイドをwekawik​​iからclojureに変換しようとしています。

これは、clojureリフレクションメカニズムが呼び出す適切なメソッドを見つけられないように見える1つのケースを除いて、これまでのところうまく機能しています-私は次のようにしています:

(def c-model (doto (NaiveBayes.) (.buildClassifier is-training-set)))

後でこれはクラスの.evaluateModelメソッドによって呼び出されます:Evaluation

(.evaluateModel e-test c-model is-testing-set)

ここe-testで、はタイプであり、 APIドキュメントweka.classifiers.Evaluationによると、メソッドはタイプの2つのパラメーターを取ります。ClassifierInstances

私がclojureから得たのは、IllegalArgumentException No matching method found: evaluateModel for class weka.classifiers.Evaluation clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53)-これc-modelは実際にはタイプであるためだと思いますが、それは-であるNaiveBayes必要があります。Classifierinstance?

私は無駄にキャストしcastてみましたが、私が理解していることから、これは実際のclojureのキャストというよりもタイプアサーションです(もちろん問題なく通過します)。Java相互運用メソッド呼び出しでキャストするタイプをclojureに明示的に指示する別の方法はありますか?(上記でリンクした元のガイドでも、からNaiveBayesへの明示的なキャストが使用されていることに注意してくださいClassifier

ここに完全なコード:/http://paste.lisp.org/display/129250

4

2 に答える 2

7

リンクされたjavadocは、分類子とインスタンスを取得するメソッドがあるというあなたの主張と矛盾します。つまり、分類子、インスタンス、および可変数のオブジェクトを取得するメソッドです。多くのSOの質問で説明されているように(現時点で私が見つけることができるのは、文字列フォーマットがキャスト例外を引き起こす理由だけですjavac)、Clojureは、基本的にコンパイラーによって作成されたフィクションであるvarargsの暗黙的なサポートを提供しません。JVMレベルでは、これは単にObject[]タイプの追加の必須パラメーターです。3番目のパラメーターである空のobject-arrayをメソッドに渡すと、正常に機能します。

于 2012-05-02T07:46:15.080 に答える
2

IllegalArgumentException No matching method found引数がクラスと一致しない場合はいつでも発生します。その名前と引数の数を持つメソッドが存在しないため、または呼び出されたクラスにその名前のメソッドが存在しないため、一致しない可能性があります。したがって、引数の数とタイプも確認してください。

これらの場合、私は基本的に常にrepl-utils/showに頼ります

于 2012-05-01T19:08:34.293 に答える