java - 在 Clojure 中访问可变的 java.util.List
问题描述
我正在使用第 3 方 Java 库,其中一个库事件将 java.util.List 作为参数传递,Clojure 将其公开为 clojure.lang.APersistentVector。我遇到的问题是该库要求我改变该列表以实现我所追求的功能。但是,由于 Clojure 已将列表作为 APersistentVector 返回,因此所有可变方法都会抛出 UnsupportedOperationException。
是否可以强制 Clojure 使用 List 的可变 Java 实现而不是不可变的 Clojure 版本?
我很欣赏这非常不像 Clojure,但它是图书馆的工作方式,现在,我只想让事情正常工作。
谢谢,
保罗
解决方案
当您说“哪个 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]
推荐阅读
- reactjs - 重定向时未定义状态值
- python - 光谱分析的相似性度量
- php - PhpUnit - 不调用模拟方法
- perl - 使用 sed 或 perl 替换两个字符之间的多个字符
- javascript - 主题提供者问题
- node.js - Puppeteer 返回以数字为键、空对象为值的对象
- powershell-2.0 - Rundeck 作业因 PermissionDenied UnauthorizedAccessException 而失败
- python - 如何在python中使用while循环创建转弯
- android - 颤振运行失败,出现错误“无法解析 'package:characters/characters.dart' 中的包 'characters'。”
- reactjs - 在对可视化进行排序时更改值