3

私はscalaテストを閲覧していましたが、「2つの新しいオブジェクト」を比較したときにコンパイラーが警告を生成する理由がわかりません。

これはテストの出力です:http: //lampsvn.epfl.ch/trac/scala/browser/scala/trunk/test/files/neg/checksensible.check

例:

checksensible.scala:12: warning: comparing a fresh object using `!=' will always yield true
println(new Exception() != new Exception())
                        ^

メソッドを実装するクラスを作成すると、次の==警告も生成されます。

class Foo(val bar: Int) {
    def ==(other: Foo) : Boolean = this.bar == other.bar
}

new Foo(1) == new Foo(1)

warning: comparing a fresh object using `==' will always yield false

編集:oxbow_lakesに感謝します、==ではなくequalsメソッドをオーバーライドする必要があります

class Foo(val bar: Int) {
    override def equals(other: Any) : Boolean = other match { 
        case other: Foo => this.bar == other.bar
        case _ => false
    }
}
4

1 に答える 1

14

メソッドをオーバーライドしてはならないこと に注意してください(代わりにメソッドをオーバーライドする必要があります)。新しいオブジェクトとは、Scalaはメソッドが定義されていない新しいオブジェクトを意味すると思います。== equalsequals

をオーバーライドしない場合equals==比較は参照比較(つまり、を使用eq)であるため、次のようになります。

new F() == new F()

常にfalseになります。

于 2009-10-08T09:00:57.023 に答える