2010-11-25 63 views
0

我試圖在Clojure中使用Java中的MPD library。一切都很順利,但這些返回java.util.Collection的方法在REPL中接收不好。讓我們來定義Clojure在java.util.Collection上拋出ClassCastException

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

而現在一些方法OK玩:

(.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 
+0

該異常的實際來源並不清楚您發佈的內容。嘗試調用(.printStackTrace * e)。 – 2010-11-25 18:35:13

+0

@亞瑟,哦,謝謝你。我試圖找到打印跟蹤無效的方式。 Iincluded – progo 2010-11-25 18:57:55

回答

1

看起來像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 []> 
相關問題