在 Clojure 中访问可变 java.util.List
Access mutable java.util.List in Clojure
我正在使用第 3 方 Java 库,其中一个库事件将 java.util.List 作为参数传递,Clojure 将其公开为 clojure.lang.APersistentVector。我遇到的问题是库要求我改变该列表以实现我所追求的功能。但是,由于 Clojure 已将列表作为 APersistentVector 返回,所有可变方法都会抛出 UnsupportedOperationException。
是否可以强制 Clojure 使用 List 的可变 Java 实现而不是不可变的 Clojure 版本?
我很欣赏这与 Clojure 很不一样,但它是库的工作方式,现在,我只想让它正常工作。
谢谢,
保罗
当您说“哪个 Clojure 公开为 clojure.lang.APersistentVector”时,您的意思并不清楚。如果 Clojure 调用 Java 方法 returns 一个对象 x class java.util.ArrayList,那么在 Clojure 中调用 (class x)
应该显示 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]
我正在使用第 3 方 Java 库,其中一个库事件将 java.util.List 作为参数传递,Clojure 将其公开为 clojure.lang.APersistentVector。我遇到的问题是库要求我改变该列表以实现我所追求的功能。但是,由于 Clojure 已将列表作为 APersistentVector 返回,所有可变方法都会抛出 UnsupportedOperationException。
是否可以强制 Clojure 使用 List 的可变 Java 实现而不是不可变的 Clojure 版本?
我很欣赏这与 Clojure 很不一样,但它是库的工作方式,现在,我只想让它正常工作。
谢谢,
保罗
当您说“哪个 Clojure 公开为 clojure.lang.APersistentVector”时,您的意思并不清楚。如果 Clojure 调用 Java 方法 returns 一个对象 x class java.util.ArrayList,那么在 Clojure 中调用 (class x)
应该显示 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]