2013-02-25 2 views
2

Я хочу использовать конструктор Java как первоклассную функцию Clojure. Мой вариант использования заключается в преобразовании последовательность строк в последовательности объектов Java, которые имеют конструктор с одной строкой:Как использовать Clojure memfn с Java-конструктором?

Простой Java объект:

public class Foo { 
    public Foo(String aString){ 
    // initialize the Foo object from aString 
    } 
} 

И в Clojure Я хочу, чтобы это сделать:

(defn make-foo (memfn Foo. a-string)) 
(apply make-foo '("one" "two" "shoe")) 

применить должен возвращать список Foo объекты, созданные из строк, но я получаю это:

IllegalArgumentException No matching method found: org.apache.hadoop.io.Text. for class java.lang.String clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53) 

ответ

7

Не беспокойтесь. memfn практически не рекомендуется в отношении анонимного литерала функции, с помощью которого вы также можете вызвать конструкторы, например, #(Foo. %).

Кроме того, ваш вызов apply будет пытаться вызвать make-foo один раз с тремя строковыми аргументами. Вероятно, вы, скорее всего, захотите:

(map #(Foo. %) ["one" "two" "three"]) 
Смежные вопросы