Проблемы с вызовом переменной Java-функции из Clojure - PullRequest
6 голосов
/ 12 апреля 2011

Я играю с Java NIO.2 API из JDK 7.

В частности, я хочу вызвать метод: Paths#get(String first, String... more)

Это статический методкоторая принимает хотя бы одну строку и возвращает соответствующий ей объект Path.Есть перегруженная форма: Paths#get(URI uri)

Однако я не могу вызвать метод top из Clojure.Ближайшее, что я могу получить, это:

(Paths/get ^String dir-fq (object-array 0))

, что не так:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

, как и следовало ожидать.В конце концов, мы передаем Object [] чему-то ожидающему String [].

Я попытался удалить форму (массив объектов) - но это только заставляет Clojure попытаться вызвать метод get (URI) - как с подсказкой типа, так и без нее.

Передачаnil как второй аргумент Paths # get (String, String ...) заставляет вызываться правильный метод, но Java 7 не работает с NPE.

Кажется, я не могу найти способClojure для выражения типа String [] - я предполагаю, что мне нужно либо сделать это, либо дать подсказку системе диспетчеризации.

Есть идеи?

1 Ответ

16 голосов
/ 12 апреля 2011

Как вы заметили, ему не нужен объект [], ему нужна строка []. object-array делает именно то, что говорит: он создает массив объектов. Если вы хотите создать массив с другим типом, make-array и into-array ваши друзья. Например здесь:

(Paths/get "foo" (into-array String ["bar" "baz"]))

В этом случае указатель String является необязательным: если вы пропустите нужный тип массива, Clojure использует тип первого объекта в качестве типа компонента массива.

...