为什么命名空间与用于互操作访问的 Java 包不同?

Why aren't namespaces the same as Java packages for interop access?

我正在 Clojure REPL 上执行以下操作:

user=> (ns clojure.lang)
nil
clojure.lang=> (def tran (clojure.lang.LockingTransaction.))
#'clojure.lang/tran
clojure.lang=> (.getReadPoint tran)

结果如下:

IllegalArgumentException No matching field found: getReadPoint for class clojure.lang.LockingTransaction  clojure.lang.Reflector.getInstanceField (Reflector.java:271)

现在这个方法does exist.

现在我想我应该可以从 REPL 访问默认访问方法了。

我可靠地得知 Clojure 命名空间与 Java 包不同。 (即解决这个问题的方法是通过反射 - 对于不需要在 Java 中反射的东西)。

为什么 Clojure 中的名称空间与 Java 互操作访问包不同?

是的class这些不是命名空间

boot.user=> (in-ns java.util.Date)
java.lang.ClassCastException: java.lang.Class cannot be cast to clojure.lang.Symbol

但是你得到的错误不是因为该字段不存在,而是因为它没有被正确初始化。这是一个 Clojure 并发原语,需要使用 java.util.concurrent.Callable 进行实例化,实现起来很痛苦,只需查看 testing example.

的 class 的末尾

正确初始化后java classes return 有意义的输出:

boot.user=> (.getTime (java.util.Date.))
1445587895021

boot.user=> (def concurrent-queue (java.util.concurrent.ConcurrentLinkedQueue.))
#'boot.user/concurrent-queue
boot.user=> (.add concurrent-queue "example")
true
boot.user=> concurrent-queue
#object[java.util.concurrent.ConcurrentLinkedQueue 0x750ee622 "[example]"]