Clojure создает исключение ClassCastException для java.util.Collection. - PullRequest
0 голосов
/ 25 ноября 2010

Я пытаюсь использовать библиотеку MPD в Java в Clojure. Все прошло хорошо, но эти методы, которые возвращают java.util.Collection, получают плохой прием в REPL. Давайте определим

(def mpd (org.bff.javampd.MPD. "localhost" ))
(def pl (.getMPDPlaylist mpd))
(def db (.getMPDDatabase mpd))

А теперь некоторые методы работают нормально:

(.getSongList pl) ; returns List<MPDSong>

работает хорошо. Но, например, каждый метод db (MPDDatabase) возвращает Collection<MPDSong> (согласно их API):

(.findAlbum db "Crises") ; returns Collection<MPDSong>
java.lang.ClassCastException (NO_SOURCE_FILE:0)

Не очень хорошо работает. Почему так, как это исправить?

След стека следует:

hello.hello=> (.findAlbum db "Crises")
java.lang.ClassCastException (NO_SOURCE_FILE:0)
hello.hello=> (.printStackTrace *e)
java.lang.ClassCastException (NO_SOURCE_FILE:0)
    at clojure.lang.Compiler.eval(Compiler.java:5440)
    at clojure.lang.Compiler.eval(Compiler.java:5391)
    at clojure.core$eval.invoke(core.clj:2382)
    at clojure.main$repl$read_eval_print__5624.invoke(main.clj:183)
    at clojure.main$repl$fn__5629.invoke(main.clj:204)
    at clojure.main$repl.doInvoke(main.clj:204)
    at clojure.lang.RestFn.invoke(RestFn.java:422)
    at user$eval13$acc__808__auto____14$fn__16.invoke(NO_SOURCE_FILE:1)
    at clojure.lang.AFn.run(AFn.java:24)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.ClassCastException
    at java.lang.Class.cast(Class.java:2990)
    at clojure.lang.Reflector.boxArg(Reflector.java:364)
    at clojure.lang.Reflector.boxArgs(Reflector.java:397)
    at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:55)
    at clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:28)
    at hello.hello$eval44.invoke(NO_SOURCE_FILE:8)
    at clojure.lang.Compiler.eval(Compiler.java:5424)
    ... 9 more
nil

1 Ответ

1 голос
/ 25 ноября 2010

Похоже, API-документация недействительна (проверка выполняется с помощью clojure.contrib.repl-utils):

user> (show MPDDatabase "findAlbum$")
===  public org.bff.javampd.MPDDatabase  ===
[ 1] findAlbum : Collection (MPDAlbum)

и вам нужен промежуточный объект MPDAlbum:

user> (.findAlbum db (MPDAlbum. "Crisis"))
#<ArrayList []>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...