2010-08-04 149 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。