2012-05-01 15 views
5

clojure'dan weka kullanmaya çalışırken, clojure'nin java interop özelliklerini kullanarak wike wiki'den clojure'a this howto guide dönüştürmeye çalışıyorum.java ile arabirim oluştururken açık olarak clojure nasıl yayınlanır

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

Daha sonra bu tarafından çağrılır: Ben -

Bu Clojure yansıma mekanizması çağırmak için doğru yöntemi bulmak için görünmüyor olabilir bir durumda, dışında, bugüne kadar işe yaradı Evaluation sınıfı .evaluateModel yöntemi:

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

e-test tip weka.classifiers.Evaluation arasında olup, their api documentation uygun yöntem türleriiki parametre alırve Instances

Ne Clojure aldığım olsa IllegalArgumentException No matching method found: evaluateModel for class weka.classifiers.Evaluation clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53) - ı c-model aslında tip NaiveBayes ait olduğu için aynı zamanda bir Classifier olmalıdır, ancak bu olduğunu tahmin - bu instance? göre, hangi.

cast ile döküm yapmayı denemedim ve anladığım kadarıyla bu bir tür iddianın (ve tabii ki sorunsuz bir şekilde) clojure'daki gerçek bir dökümden daha fazlasıdır. Java interop yöntem çağrılarında hangi türlerin yayınlanacağını açıkça belirtmenin başka bir yolu var mı? /http://paste.lisp.org/display/129250

cevap

6

bağlantılı javadoc bir Sınıflandırıcı ve Örneklerini alarak bir yöntem var olduğunu doğrulayan çelişmektedir Örnekler, ve Nesnelerin değişken bir numarası. Bir çok SO sorusunda ele alındığı gibi (şu anda tek bulabildiğim tek şey Why Is String Formatting Causing a Casting Exception?'dur), Clojure, temel olarak javac derleyicisinin oluşturduğu kurgular olan varargs için örtülü destek sağlamaz. JVM seviyesinde, sadece Object [] tipinde gerekli olan ek bir parametredir. Üçüncü bir parametreyi, boş bir nesne dizisini, yönteminize iletirseniz, iyi çalışır.

+0

Bir saniye için varargs ile ne yapacağını merak ediyordum, ama bu cevaba rastlamadım - teşekkür ederim! –

2

IllegalArgumentException No matching method found Herzaman argümanlar olur:

burada

Tam kodu (yukarıda bağlantılı orijinal kılavuz ayrıca Classifier için NaiveBayes gelen açık döküm kullandığını unutmayın) sınıfı eşleştirmeyin. Eşleşemedikleri için, bu isimde ve argüman sayısında hiçbir yöntem bulunmadığından veya çağrılan sınıfta bu isimle hiçbir yöntem bulunmadığından. ayrıca argümanların sayısını ve tipini de kontrol edin. , Bir Sınıflandırıcı alarak bir yöntemdir ne var -

temelde hep bu durumlarda

yılında repl-utils/gösteri başvurmak
+0

argümanların uyuşmadığı şey de bulduğum şey, 'instance? 'Ile türlerini zaten kontrol ettim ve tüm istediğim - sadece tercümanın metot çağırma konusunda başka bir şey yapmasıdır :(repl-utils/show: clojars.org üzerinde bulduğum "clojure-contrib" kütüphanesini (sürüm 1.2) kullanırken ve show fonksiyonu bir hata attığında bir uyarı mesajı alıyorum. clojure 1.4 ile –

+2

clojure 1.3 ve üstü, metin tabanlı 'show' veri-odaklı fonksiyon tarafından değiştirildi' clojure.reflect/reflect' – amalloy

İlgili konular