2012-05-01 9 views
5

Próbując użyć weka z clojure, staram się przekonwertować this howto guide z wiki weka na clojure, używając funkcji java interop z clojure.Jak jawnie rzutować w clojure podczas łączenia z java

Ten pracował dobrze do tej pory, z wyjątkiem jednego przypadku, w którym mechanizm clojure odbicie nie może wydawać się znaleźć odpowiedni sposób, aby wywołać - mam:

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

Później ten zostanie wywołany przez .evaluateModel metodą klasy Evaluation:

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

gdzie e-test jest typu weka.classifiers.Evaluation i według their api documentation sposób dwa parametry typów Classifier i Instances

Co mam z Clojure jest jednak IllegalArgumentException No matching method found: evaluateModel for class weka.classifiers.Evaluation clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53) - Myślę, że to dlatego, że c-model jest rzeczywiście typu NaiveBayes, chociaż powinno być również Classifier - co to jest, według instance?.

Próbowałem odlewania z cast bezskutecznie, a z tego co rozumiem, jest to raczej twierdzenie typu (i przechodzi bez problemów, oczywiście) niż prawdziwa obsada w clojure. Czy istnieje inny sposób jawnego powiadamiania clojure, które typy do rzutowania w wywoływanych metodach java interop? (Zauważ, że oryginalny przewodnik I połączone powyżej wykorzystuje również wyraźne odlana z NaiveBayes do Classifier)

Pełny kod tutaj: /http://paste.lisp.org/display/129250

Odpowiedz

6

prowadzi link javadoc zaprzecza swoje twierdzenie, że istnieje metoda robienia klasyfikatora i instancji - co istnieje, jest to metoda podejmowania klasyfikatora, Instancje, i zmienna liczba obiektów. Jak omówiono w wielu pytaniach SO (jedyny, który mogę znaleźć w tej chwili to Why Is String Formatting Causing a Casting Exception?), Clojure nie zapewnia niejawnego wsparcia dla varargs, które są w zasadzie fikcjami stworzonymi przez kompilator javac. Na poziomie JVM jest to po prostu dodatkowy wymagany parametr typu Object []. Jeśli przekażesz trzeciemu parametrowi, pustej macierzy obiektów, do swojej metody, zadziała ona dobrze.

+0

Zastanawiam się, co zrobić z varargs na sekundę, ale nie natknąłem się na tę odpowiedź - dziękuję! –

2

IllegalArgumentException No matching method found dzieje się w każdej chwili argumenty nie pasują do klasy. Nie można ich dopasować, ponieważ nie istnieje żadna metoda z tą nazwą i liczbą argumentów lub ponieważ nie istnieje żadna metoda o tej nazwie w wywołanej klasie. więc sprawdź także liczbę i typ argumentów.

I w zasadzie zawsze uciekać się do rEPL-utils/Pokaż w tych przypadkach

+0

że argumenty się nie zgadzają to to, co również znalazłem, chodzi o to, że już sprawdziłem ich typ za pomocą 'instancji?' I to robi wszystko co chcę - tylko interpreter robi coś innego na inwokacji metody :(Dotyczące repl-utils/show: Dostaję masę ostrzeżeń, kiedy 'używam' biblioteki clojure-contrib' (wersja 1.2), którą znalazłem na clojars.org, a funkcja show rzuca błąd - nie wydaje się grać dobrze z clojure 1.4 –

+2

W clojure 1.3 i nowszym tekstowe 'show' zostało zastąpione przez funkcję" clojure.reflect/reflect "opartą na danych. – amalloy

Powiązane problemy