user> (let [h (HashMap.)]
(.put h 1 2)
(let [p1 (first h)
p2 (first {1 2})]
(println (.hashCode p1) (.hashCode p2)
(= p1 p2) (= p2 p1)
(.equals p1 p2) (.equals p2 p1))))
3 994 false false true false
clojure.lang.MapEntry 没有遵循 hashCode 或 equals 的 java.util.Map$Entry 合同。 这导致了上述非反射的 .equals 行为。
我意识到这不仅仅是一个简单的错误;这是一个基本问题,因为不可能一致地实现 java.util.List 和 java.util.Map$Entry,这是 clojure.lang.MapEntry 主张的。 总体而言,我确实发现 Clojure 的映射条目与向量等价非常有用,可能不愿放弃这一点。 但我认为,至少应该在某个地方记录这个瑕疵,因为它可能导致一些非常奇怪且难以捕捉的错误。