代码之家  ›  专栏  ›  技术社区  ›  mike3996

Clojure在java.util.Collection上抛出ClassCastException

  •  0
  • mike3996  · 技术社区  · 14 年前

    我想用一个 MPD library 在爪哇语中在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 回复  |  直到 14 年前
        1
  •  1
  •   Jürgen Hötzel    14 年前

    看起来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 []>