Memory management Clojure Java互操作内存模型

Memory management Clojure Java互操作内存模型,memory-management,clojure,jvm,Memory Management,Clojure,Jvm,Clojure的内存模型如何用于Java互操作?JVM在运行Java库函数时是否使用Clojure的持久内存模型,或者Java函数的结果在返回时是否强制为持久值?Clojure的持久内存模型是语言约束的构造和不可变数据结构的库(用Java实现)。它不适用于Java互操作 JVM没有意识到这一点 Java函数的结果按原样返回 Java互操作旨在让您以Java方式直接访问所需的Java。您可以轻松地使用它来破坏Clojure持久内存模型。例如 =>(let [arr (double-arr

Clojure的内存模型如何用于Java互操作?JVM在运行Java库函数时是否使用Clojure的持久内存模型,或者Java函数的结果在返回时是否强制为持久值?

Clojure的持久内存模型是语言约束的构造和不可变数据结构的库(用Java实现)。它不适用于Java互操作

  • JVM没有意识到这一点
  • Java函数的结果按原样返回
Java互操作旨在让您以Java方式直接访问所需的Java。您可以轻松地使用它来破坏Clojure持久内存模型。例如

=>(let [arr (double-array (range 5))]
    (aset-double arr 3 45.2) arr)
[0.0, 1.0, 2.0, 45.2, 4.0]
不能对Java数组执行Clojure操作

=> (assoc (to-array (range 5)) 2 67.4)
ClassCastException [Ljava.lang.Object; cannot be cast to clojure.lang.Associative  clojure.lang.RT.assoc (RT.java:702)
或Java的东西到Clojure数组

=> (aset (vec (range 5)) 2 67.4)
IllegalArgumentException No matching method found: aset clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:80)
如果您尝试Java中的assignment,我认为您将在运行时得到一个
不支持的操作异常