请在 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
by

您是否认为 clojure.java.reflect 更符合您要做的尝试?

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

by
我非常希望使用 clojure.java.data 及其转换逻辑。由于我无法控制所使用的类,如果能避免在 java.lang.Class 上抛出异常,那将很不 punishing. 从那里开始我就没问题了,也知道怎么做。
0
by

我的问题可能是

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

当你执行 (j/from-java-shallow Class {}) 时,你会看到许多属性的类型为 Class 数组,如果尝试将这些从 Java 转换为 Clojure,将会出现递归 - 而在 Class 的情况下,这种递归没有“底部”。

为了使 from-java-deep 在这里不会崩溃,需要对 recursion 提供一个“底部”。无论是任意深度还是追踪所有看到的 Java 对象,不进一步展开相同的对象(假设检查足够创建“底部”)。但接下来还有一个问题,就是在这个点上 from-java-deep 应该做什么:返回该子树的 nil,返回其他哨兵值,返回 Java 对象本身,抛出不同的异常(以指示哪个 getter 展开失败,这样您可以再次尝试并告知不要展开该 getter)?

by
是的,所有的这些都是真的。所以我最低的要求是 `(j/from-java-deep Class {})` 不会抛出异常。思考我的解决方案,也许 `{:class java.lang.Class}` 对于这个情况来说并不坏。如果它被文档化,用户可以检测到这种情况下并做他们认为合适的任何操作。在 `clojure.java.data` 中的另一些情况得到了特殊处理,这将是第 n+1 个情况。
...