2024年Clojure调查!中分享您的观点。

欢迎!请参阅关于页面以获取更多关于如何使用本站的信息。

0
java.data

`(clojure.java.data/from-java-deep Class {})` 抛出StackOverflowError

文档中对此没有说明,但我希望看到 java.data 处理这种情况。

您可以在 https://github.com/henrik42/java.data-with-Class/tree/master 找到一个小例子。

这显示了错误。

clj -X main/this-call-throws
Execution error (StackOverflowError) at clojure.java.data/add-deep-getter-fn (data.clj:121).

作为一个替代方案,我使用 (defmethod j/from-java-deep Class [clazz _] {:class clazz}) -- 但这并不是一个真正的解决方案,因为它甚至没有给出 `(from-java-shallow Class {})` 会给出的结果。

clj -X main/this-call-works
(j/from-java-deep Class) ;=>  {:class java.lang.Class}

使用

(defmethod j/from-java-deep Class [clazz _] (j/from-java-shallow Class {}))

替代方案也好不到哪里去,因为它也不是深度复制。

3 个答案

0

已选择
 
最佳答案

https://clojure.atlassian.net/browse/JDATA-23 -- 我可能这个月无法解决这个问题,但确实需要进行分析。

0

clojure.java.reflect 是否更适合您要尝试的操作?

类及其字段明显存在许多循环。

我非常希望能使用 clojure.java.data 及其转换逻辑。由于我无法控制我所使用的类,如果 c.j.d 能够在 java.lang.Class 上不抛出异常,那就太好了。从那以后我都会处理好并知道如何操作。
0

我想问的问题是

您认为 (j/from-java-deep Class {}) 应该产生什么结果?

当您执行 (j/from-java-shallow Class {}) 时,您会看到许多属性为 Class 类型的数组,所以如果您尝试将它们从 Java 转换为 Clojure,您将得到递归,而对于 Class,这种递归没有“结束”。

为了让 from-java-deep 不会在这一点上崩溃,递归需要有“结束”。要么是任意的深度,要么是跟踪您所看到的所有 Java 对象,并且不进一步展开相同对象(假设此检查足以创建“结束”)。然后,还有 from-java-deep 在这一点上应该做什么的问题:返回该子树的 nil,返回其他信号值,返回 Java 对象自身,抛出不同的异常(以指示哪个获取程序失败了,这样您可以再次尝试并告诉它不要展开该获取程序)?

是的,这些都是真的。因此,我的最低要求是 `(j/from-java-deep Class {})` 不抛出异常。考虑到我的解决方案,或许对于这种案例,`{:class java.lang.Class}` 的结果并不那么糟糕。如果进行了文档说明,用户可以检测到这种情况并执行他们认为适合其用例的操作。`clojure.java.data` 中还有一些其他情况接收了特殊处理,所以这将是第 n+1 个案例。
...