2010-09-21 23 views
1

我試圖在Clojure中使用一些Java類。我已經用Scala成功地嘗試過了,但是在Clojure中,我得到了一個IllegalArgumentException。使用javax.sound.midi.Sequencer的Clojure問題

這裏的API:http://download.oracle.com/javase/1.4.2/docs/api/java/lang/reflect/Method.html

下面的代碼:

(import '(javax.sound.midi MidiSystem Sequencer Sequence)) 
(def mySequencer (MidiSystem/getSequencer)) 
(def mySequence (Sequence. Sequence/PPQ 10)) 
((.setSequence mySequencer) mySequence) 

拋出異常:

Exception in thread "main" java.lang.IllegalArgumentException: No matching field found: setSequence for class com.sun.media.sound.RealTimeSequencer (recordmidi.clj:0) 
    at clojure.lang.Compiler.eval(Compiler.java:5341) 
    at clojure.lang.Compiler.load(Compiler.java:5736) 
    at clojure.lang.Compiler.loadFile(Compiler.java:5699) 
    at clojure.main$load_script__6268.invoke(main.clj:213) 
    at clojure.main$script_opt__6296.invoke(main.clj:265) 
    at clojure.main$main__6314.doInvoke(main.clj:346) 
    at clojure.lang.RestFn.invoke(RestFn.java:409) 
    at clojure.lang.Var.invoke(Var.java:365) 
    at clojure.lang.AFn.applyToHelper(AFn.java:165) 
    at clojure.lang.Var.applyTo(Var.java:482) 
    at clojure.main.main(main.java:37) 
Caused by: java.lang.IllegalArgumentException: No matching field found: setSequence for class com.sun.media.sound.RealTimeSequencer 
    at clojure.lang.Reflector.getInstanceField(Reflector.java:245) 
    at clojure.lang.Reflector.invokeNoArgInstanceMember(Reflector.java:267) 
    at user$eval__11.invoke(recordmidi.clj:4) 
    at clojure.lang.Compiler.eval(Compiler.java:5325) 
    ... 10 more 

試圖用Clojure 1.1.0和1.2.0。在Scala中工作正常。 我也試過看着使用Clojure的Sequencer類的方法,是的,setSequence(Sequence)方法在那裏是

這是我用過的Java調用的唯一問題。

回答

2

嘗試

(.setSequence mySequencer mySequence) 

這將返回在REPL,這似乎對給出的方法的返回值爲空權爲零(並轉化爲mySequencer.setSequence(mySequence)這聽起來像你想要的)。

我也曾經在博客中使用Java MIDI庫從Clojure的,也許有點幫助:

http://citizen428.net/archives/396

+0

謝謝,僅此而已。我只是用Clojure的方式錯誤地調用Java方法:-)並感謝鏈接。 – Grav 2010-09-21 13:37:40