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的clojure.lang.MapEntry不遵循java.util.Map$Entry的hashCode或equals合同。这导致了以上非自反的.equals行为。
我明白这不仅仅是一个简单的错误;这是一个根本性问题,因为在clojure.lang.MapEntry声称同时实现java.util.List和java.util.Map$Entry是不可能达到的。总的来说,我发现Clojure映射条目的等价于向量是非常有用的,可能不希望放弃这个特性。但是,我认为至少应该在这部分文档化,因为这个小问题可能会导致一些非常奇怪且难以捕捉的bug。