web-dev-qa-db-ja.com

GStringImplでequals()および==を使用した場合のGroovyの異なる結果

groovy docs によると、==はNullPointerExceptionの回避も考慮しているため、単なる '巧妙な' equals()です。したがって、オブジェクトがnullでない場合、==およびequals()は同じ値を返す必要があります。ただし、次のスクリプトを実行すると予期しない結果が得られます。

println "${'test'}" == 'test'
println "${'test'}".equals('test')

私が得ている出力は

true
false

この例は here にあります。

これはGStringImplに関連する既知のバグですか、それとも私が見逃しているものですか?

50
Anuj Arora

いい質問です。上のコードの驚くべきことは

_println "${'test'}".equals('test')
_

falseを返します。コードのもう1行は期待される結果を返すので、そのことは忘れましょう。

概要

_"${'test'}".equals('test')
_

equalsが呼び出されるオブジェクトはGStringImpl型であるのに対し、_'test'_はString型であるため、等しいとは見なされません。

しかし、なぜ?

明らかにGStringImplequals実装は、Stringと同じ文字を含むthisが渡されたときにtrueを返すように書かれている可能性があります。一応、これは合理的なことのようです。

このように書かれていない理由は、それがequals契約に違反するためだと推測しています。

対称です。null以外の参照値xおよびyについて、y.equals(x)がtrueを返す場合にのみ、x.equals(y)はtrueを返す必要があります。

String.equals(Object other)の実装は、GSStringImplを渡すと常にfalseを返すため、GStringImpl.equals(Object other)Stringを渡すとtrueを返すと、違反になります。対称要件の。

62
Dónal