用户> (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没有遵循hashCode或equals的契约(对于java.util.Map$Entry)。 因此,它会像上面那样导致非自反的>equals行为。
我意识到这不仅仅是一个简单的错误;这是一个基本问题,因为在java.util.List和java.util.Map$Entry中,无法始终一致地实现这两个接口,而clojure.lang.MapEntry正是这样声明的。 总体而言,我认为Clojure映射条目的行为等同于向量是非常有用的,可能不会想放弃这一点。 但,我认为至少应该在某处记录这样的问题,因为它可能导致一些非常奇怪且难以捕捉的bug。