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没有遵循java.util.Map$Entry的hashCode或equals合约。这导致上述非自反的.equals行为。
我意识到这不仅仅是简单的一个错误;它是一个基本问题,因为在clojure.lang.MapEntry声称做到的java.util.List和java.util.Map$Entry之间不可能一致实现。总的来说,我觉得Clojure映射条目与向量等价非常有用,可能不会想放弃这个功能。但是,我认为至少应该在某个地方记录这个瑕疵,因为它可能导致一些非常奇怪且难以捕获的错误。