2012-05-01 23 views
5

試圖從clojure使用weka,我試圖使用clojure的java interop功能將this howto guide從weka wiki轉換爲clojure。如何在與java接口時顯式轉換爲clojure

這一直運作良好,到目前爲止,除了一種情況,似乎在Clojure的反射機制不能找到合適的方法來調用 - 我有:

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

後來這將被調用所述Evaluation類的.evaluateModel方法:

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

其中e-testweka.classifiers.Evaluation型的,並且根據該their api documentation方法採用的類型兩個參數3210和Instances

我從Clojure的獲得雖然是IllegalArgumentException No matching method found: evaluateModel for class weka.classifiers.Evaluation clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53) - 我想,這是因爲c-model實際上是NaiveBayes型的,雖然它也應該是一個Classifier - 它是,根據instance?

我試着用cast鑄造無濟於事,從我的理解來看,這更像是一個類型斷言(當然,沒有問題的通過),而不是真正的clojure。是否有另一種方法明確告訴clojure在java interop方法調用中投入哪些類型? (請注意,我在上面鏈接的原始指南還使用從NaiveBayesClassifier有明確的轉換)

全部代碼在這裏:/http://paste.lisp.org/display/129250

回答

6

該鏈接的javadoc違揹你的要求,有采取分類和實例的方法 - 什麼就有什麼,是採取分類的方法,實例,和可變數目的對象。正如許多SO問題(目前我能找到的唯一一個是Why Is String Formatting Causing a Casting Exception?)中討論的那樣,Clojure沒有提供對可變參數的隱式支持,這是基於javac編譯器創建的基本虛構。在JVM級別,它只是Object []類型的附加必需參數。如果您將第三個參數(一個空的對象數組)傳遞到您的方法中,它將正常工作。

+0

我想知道如何處理可變參數,但沒有遇到這個答案 - 謝謝! –

2

IllegalArgumentException No matching method found隨時發生的爭論與班級不匹配。它們可能無法匹配,因爲不存在具有該名稱和參數數量的方法,或者因爲在調用的類中沒有該名稱的方法。所以還要檢查參數的數量和類型。

我基本上總是訴諸REPL-utils的/顯示在這些情況下

+0

參數不匹配是我還發現,事情是我已經檢查他們的類型與'實例?',這是我所需要的 - 只有解釋器在方法調用上做了其他事情:(關於repl-utils/show:在使用我在clojars.org上發現的'clojure-contrib'庫(版本1.2)時,我得到了一堆警告,並且show函數拋出一個錯誤 - 它似乎沒有播放以及clojure 1.4 –

+2

在clojure 1.3及更高版本中,基於文本的'show'已被數據驅動函數'clojure.reflect/reflect'取代 – amalloy