首页 > 解决方案 > 在 Clojure 中访问可变的 java.util.List

问题描述

我正在使用第 3 方 Java 库,其中一个库事件将 java.util.List 作为参数传递,Clojure 将其公开为 clojure.lang.APersistentVector。我遇到的问题是该库要求我改变该列表以实现我所追求的功能。但是,由于 Clojure 已将列表作为 APersistentVector 返回,因此所有可变方法都会抛出 UnsupportedOperationException。

是否可以强制 Clojure 使用 List 的可变 Java 实现而不是不可变的 Clojure 版本?

我很欣赏这非常不像 Clojure,但它是图书馆的工作方式,现在,我只想让事情正常工作。

谢谢,

保罗

标签: javalistclojuremutable

解决方案


当您说“哪个 Clojure 公开为 clojure.lang.APersistentVector”时,不清楚您的意思。如果 Clojure 调用的 Java 方法返回带有类 java.util.ArrayList 的对象 x,那么(class x)在 Clojure 中调用应该显示 java.util.ArrayList。

您正在使用的库中是否可能发生了一些转换代码,也许是用于 Java 方法调用的 Clojure 包装器,正在执行此转换?

Clojure REPL 会话示例显示您确实可以获取 java.util.ArrayList 对象并在 Clojure 代码中改变它们:

user=> (def mutlist1 (java.util.ArrayList. [1 2 3]))
#'user/mutlist1
user=> mutlist1
[1 2 3]
user=> (class mutlist1)
java.util.ArrayList
;; add a new element -1 at index 1
user=> (.add mutlist1 1 -1)
nil
user=> mutlist1
[1 -1 2 3]

推荐阅读