Clojure的内存模型是如何为Java互操作工作的?在运行Java库函数时,JVM是否使用Clojure的持久化内存模型,或者Java函数的结果在返回时是否被强制转换为持久值?
发布于 2014-02-27 21:59:06
Clojure的持久内存模型是语言约束的构造和不可变数据结构库(用Java实现)。它不适用于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语言进行赋值,我想你会在运行时得到一个UnsupportedOperationException。
https://stackoverflow.com/questions/22069436
复制相似问题