groovy docs によると、==はNullPointerExceptionの回避も考慮しているため、単なる '巧妙な' equals()です。したがって、オブジェクトがnullでない場合、==およびequals()は同じ値を返す必要があります。ただし、次のスクリプトを実行すると予期しない結果が得られます。
println "${'test'}" == 'test'
println "${'test'}".equals('test')
私が得ている出力は
true
false
この例は here にあります。
これはGStringImplに関連する既知のバグですか、それとも私が見逃しているものですか?
いい質問です。上のコードの驚くべきことは
_println "${'test'}".equals('test')
_
false
を返します。コードのもう1行は期待される結果を返すので、そのことは忘れましょう。
_"${'test'}".equals('test')
_
equals
が呼び出されるオブジェクトはGStringImpl
型であるのに対し、_'test'
_はString
型であるため、等しいとは見なされません。
明らかにGStringImpl
のequals
実装は、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を返すと、違反になります。対称要件の。