2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请查看 关于 页面,了解更多关于如何使用本服务的信息。

0
Java 互操作
这会产生一个反射警告


(let [id-1 3
      id-2 1
      id-3 2
      ids [id-1 id-2 id-3]]
  #(compare (.indexOf ids %1) (.indexOf ids %2)))
;; => 无法解析对 clojure.lang(IPersistentVector 的 indexOf 方法调用的方法。


这并不会


(let [ids [3 2 1]]
  #(compare (.indexOf ids %1) (.indexOf ids %2)))


唯一的区别在于向量的元素是否是文本的,这在调用 indexOf 时不应该产生影响。

2 答案

0

评论由:alexmiller

我认为这里发生的事情是在第一种情况下,它被类型化为 PersistentVector(由读取器读取的具体数据结构)。PV 实现 Collection 并不需要反射。

在第二种情况下,需要评估向量,其类型为 IPersistentVector(一个接口)。IPV 不扩展 Collection(它独立于该接口),因此找不到 indexOf 方法。

从两个案例中退后一步,我们在一个对象上进行 Java 互操作,我们期望它是一个 Collection。我在是否应该在执行互操作时期望 ids 携带这些信息方面摇摆不定。这取决于您认为 Clojure 向量集合是 Java 集合(与其实现)的程度。

在我看来,这似乎不容易干净解决方案。

0
参考:https://clojure.atlassian.net/browse/CLJ-2382(由 alex+import 报告)
...