2016-02-23 5 views
0

У меня сегодня проблема, потому что я не знаю, как вызвать класс java, который расширяет подкласс. Я знаю, что есть знак $ для вложенного класса, но здесь я потерян.Clojure: вызов подкласса java абстрактного класса

Чтобы быть более ясным, вот классы:

Абстрактный класс:

http://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math3/fitting/AbstractCurveFitter.html

Подкласс:

http://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math3/fitting/SimpleCurveFitter.html

Честно говоря, я забыл много о Java, но я вижу, что для подкласса нет конструктора. Проблема в том, что я должен использовать подкласс.

Вот код

(defn apache-logistic-reg [data x0 lamb] 
    (let [f (Logistic$Parametric.) 
     start (def-start x0 lamb) 
     fitter (.create SimpleCurveFitter. f start) 
     points (double-array (extract-points data))] 
    (.fit fitter points))) 

Проблема заключается в том, что я не могу назвать SimpleCurveFitter. потому что он не имеет конструктора. И AbstractCurveFitter не имеет .create, плюс, если я помню, что абстрактные классы нельзя отличить.

И если я хорошо помню, конструктор SimpleCurveFitter имел бы название своего абстрактного класса, но, возможно, я ошибаюсь.

Как я могу это сделать?

Спасибо Вам

ответ

2

Вам не нужно вызвать конструктор в SimpleCurveFitter, так как она обеспечивает статический метод create получить экземпляр для вас (который вы уже пытаетесь использовать). Просто сделайте статический метод вызова этого метода, чтобы получить экземпляр:

(.create SimpleCurveFitter f start) ;; No '.' after SimpleCurveFitter 
(. SimpleCurveFitter create f start) ;; Alternate syntax 
(SimpleCurveFitter/create f start) ;; Most common syntax (pointed out by amalloy) 
+0

Большое спасибо, наконец, это было «просто», как String, и так далее, я представил себе более сложные манипуляции! –

+1

Третий синтаксис здесь, безусловно, наиболее типичный для вызова статических методов. – amalloy

Смежные вопросы