Scala の BigDecimal は、equals/hashCode 契約に違反しますか?
-
20-09-2019 - |
質問
として Ordered
trait
要求、 equals
Scala のメソッド BigDecimal
クラスは順序と一致しています。ただし、ハッシュコードはラップされたものから単純に取得されます。 java.math.BigDecimal
したがって、equals と矛盾します。
object DecTest {
def main(args: Array[String]) {
val d1 = BigDecimal("2")
val d2 = BigDecimal("2.00")
println(d1 == d2) //prints true
println(d1.hashCode == d2.hashCode) //prints false
}
}
これが既知の問題であるという言及は見つかりません。何かが足りないのでしょうか?
解決
Scalaのユーザーメーリングリストの人を超えるが、これはバグであることに同意するように見えます。私は、誰が今までハッシュ構造でキーとしてBigDecimal
を使用していないので、それは今までピックアップされていないと思います。これはバグ#2304 の
他のヒント
アップデート: この答えは間違っています!なぜそれが間違っているのかを理解するのにコメントが役立つと思うので、それを残しておきます。
これは違反の例ではありません equals
/hashCode
契約。かどうかを確認する必要があります d1.equals(d2)
それを証明するには等しいです。本当に、 d1.equals(d2)
falseを返します。なぜ?
それは、「2」は「2.00」とまったく同じではないからです。右側の値には有効数字が多くなります。言い換えれば、それらは等しいです 価値 (2 == 2.00) ですが、次の点が異なります。 規模 (0 != 2).
ソースコードを読むと ここ, 、2 つの数値については、Java に分類されることがわかります。 BigDecimal
equals
実装。次に、これを読むと、 Java ドキュメント これがどのように機能するかについて詳しく説明します。
所属していません StackOverflow