2012-05-01 31 views
5

Trong cố gắng sử dụng weka từ clojure, tôi đang cố gắng chuyển đổi this howto guide từ wiki weka sang clojure bằng cách sử dụng các tính năng tương tác java của clojure.Làm thế nào để cast một cách rõ ràng trong clojure khi interfacing với java

này đã làm việc tốt cho đến nay, ngoại trừ trong một trường hợp, nơi mà các cơ chế clojure phản ánh dường như không thể tìm ra phương pháp đúng để gọi - Tôi có:

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

Sau này sẽ được gọi bởi các .evaluateModel phương pháp của lớp Evaluation:

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

nơi e-test là loại weka.classifiers.Evaluation và theo their api documentation phương pháp này có hai tham số có kiểu ClassifierInstances

Những gì tôi nhận được từ clojure dù là IllegalArgumentException No matching method found: evaluateModel for class weka.classifiers.Evaluation clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53) - Tôi đoán rằng điều này là do c-model thực sự là loại NaiveBayes, mặc dù nó cũng phải là một Classifier - đó là, theo instance?.

Tôi đã cố gắng truyền với cast không có kết quả, và từ những gì tôi hiểu điều này có nhiều xác nhận kiểu hơn (và không gặp vấn đề gì). Có cách nào khác nói rõ ràng clojure mà các loại để đúc trong các cuộc gọi phương thức interop java? (Lưu ý rằng các hướng dẫn ban đầu tôi liên kết ở trên cũng sử dụng một diễn viên rõ ràng NaiveBayes-Classifier)

Full mã ở đây: /http://paste.lisp.org/display/129250

Trả lời

6

Các javadoc liên kết mâu thuẫn với tuyên bố của bạn rằng có một phương pháp tham gia một Classifier và một trường hợp - những gì có, là một phương pháp tham gia một Classifier, một Trường hợp, và một số biến thể của các đối tượng. Như đã thảo luận trong một số câu hỏi SO (chỉ có một trong số đó tôi có thể tìm thấy tại thời điểm này là Why Is String Formatting Causing a Casting Exception?), Clojure không cung cấp hỗ trợ ngầm cho varargs, đó là cơ bản hư cấu được tạo ra bởi trình biên dịch javac. Ở cấp độ JVM, nó chỉ đơn giản là một tham số bắt buộc bổ sung của kiểu Object []. Nếu bạn vượt qua một tham số thứ ba, một mảng đối tượng rỗng, vào phương thức của bạn, nó sẽ hoạt động tốt.

+0

tôi đã tự hỏi phải làm gì với varargs trong một giây, nhưng không đi qua câu trả lời đó - cảm ơn bạn! –

2

IllegalArgumentException No matching method found xảy ra bất cứ lúc nào các đối số không phù hợp với lớp học. Chúng có thể không khớp vì không có phương thức nào tồn tại với tên và số đối số đó hoặc vì không có phương thức nào tồn tại với tên đó trong lớp được gọi. vì vậy cũng kiểm tra số lượng và loại đối số.

tôi về cơ bản luôn luôn dùng đến repl-utils/hiển thị trong những trường hợp

+0

mà các đối số không khớp là những gì tôi cũng tìm thấy, điều là tôi đã kiểm tra kiểu của chúng với 'instance?' Và điều đó làm tất cả những gì tôi muốn - chỉ có trình thông dịch thực hiện điều gì đó khác trên phương thức invocation :(Về repl-utils/show: Tôi nhận được một loạt các cảnh báo khi 'sử dụng' thư viện 'clojure-contrib' (phiên bản 1.2) mà tôi tìm thấy trên clojars.org và hàm hiển thị đưa ra một lỗi - nó dường như không chơi tốt với clojure 1.4 –

+2

Trong clojure 1.3 và cao hơn, 'show' dựa trên văn bản đã được thay thế bằng hàm data-driven 'clojure.reflect/reflect'. – amalloy

Các vấn đề liên quan