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 映射条目与向量等效非常有用,可能不会想要放弃这一点。但是,我认为至少应该在某个地方记录这个瑕疵,因为这个瑕疵可能导致某些非常奇怪且难以捕捉的错误。