2010-08-04 140 views
9

我可以在clojure中使用(.toUpperCase「GOOD」),因爲「GOOD」是java字符串,並且java字符串具有toUpperCase方法。從Clojure調用java函數

我也可以使用clojure中的(java.io.File/separator)作爲調用java函數的一種方法。但是,爲什麼我不能調用(java.lang/Object wait 3)或(java.lang.System/println「hi」)?爲什麼我不能調用(java.lang/Object wait 3)或(java.lang.System/println「hi」)?爲什麼不能調用

  • 我們不能使用Clojure的所有java函數嗎?
  • 如果沒有,是否有任何規定來打電話給他們?如果是這樣,這些功能的參考在哪裏?

回答

17

您可以使用Clojure提供的所有Java函數。請參閱Clojure的Java interop上的精彩網頁。

尤其是,您只需要根據您正在處理的Java結構的類型來獲得正確的語法,例如,從java.lang.System中執行println方法靜態成員在「走出去」:

(.println (System/out) "hi") 
+2

沒有probs,原因是separator是File類的一個靜態成員,就像out是System類的靜態成員一樣。在println的情況下,您實際上將兩個Java interop構造鏈接在一起 - 訪問System.out,然後對結果調用println。 – mikera 2010-08-04 15:01:07

6

作爲國內較早的海報指出,這兩個例子你能給只是有點過:

(.wait (java.lang.Object.) 3) ;; this actually throws an IllegalMonitorStateException 

(.println java.lang.System/out "hi") 

應工作!

2

起初的Object.wait()函數不是一個靜態函數,你應該使用爲:

(.wait(java.lang.Object繼承)3)

二的Object.wait ()函數應該在你獲得鎖之後調用。否則,它將拋出IllegalMonitorStateException。