2009-08-28 10 views
3

Orderedtraitの要求では、ScalaのBigDecimalクラスのequalsメソッドは、順序と一致しています。ただし、ハッシュコードは単にラップされたjava.math.BigDecimalから取得されるため、equalsと矛盾します。ScalaのBigDecimalはequals/hashCode規約に違反していますか?

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 
    } 
} 

これは既知の問題ではありません。何か不足していますか?

答えて

7

Scala Userメーリングリストの担当者は、これがバグであることに同意しているようです。私はこれまでにはピックアップされていないと思います。誰もハッシュ構造のキーとしてBigDecimalを使用したことがないからです。それはされているfiled as bug #2304

0

更新:この回答は間違っています。私はコメントがなぜそれが間違っているのを見て有用であると思うので私はそれを残しました。


これはequals/hashCode契約の違反の例ではありません。 d1.equals(d2)がそれを証明するのに等しいかどうかを確認する必要があります。実際、d1.equals(d2)はfalseを返します。どうして?

「2」は「2.00」とまったく同じではないためです。右の値はより重要な数字を持っています。つまり、の値は(2 == 2.00)ですが、スケール(0!= 2)が異なります。

ソースコードhereを読むと、2つの数字の場合、Java BigDecimalequals実装になることがわかります。次に、Java documentationを読むと、これがより詳細にどのように機能するかが説明されます。

+2

これは誰もがScalaについて行くと読む必要がupvotingです! Scalaの '=='はJavaの '.equals'に相当します。 **この回答は間違っています** –

+0

* @ John * - あなたの答えはScalaで実行しようとしましたか?それは間違っています! 'scala.BigDecimal'と' java.math.BigDecimal'は別のものです –

+0

* @ John * - ごめんなさい:リンクをたどると、 'equals'メソッドがJavaの' BigDecimal.compare 'method –

関連する問題