59

Groovy docsによると、これは次のことも回避するため==、単なる「賢い」ものです。equals()NullPointerException

Java のメソッド==は実際には Groovy のis()メソッドであり、 Groovy のメソッド==は賢いequals()!

[...]

しかし、通常の比較を行うには、左または右がそうであるかどうかに関係なく、equals()Groovy の を優先する必要があります。==NullPointerExceptionnull

そのため、オブジェクトが null でない場合、==andequals()は同じ値を返す必要があります。ただし、次のスクリプトを実行すると予期しない結果が得られます。

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

私が得ている出力は次のとおりです。

true
false

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

4

2 に答える 2

74

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

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

戻りますfalse。コードのもう 1 行は期待どおりの結果を返すので、それについては忘れましょう。

概要

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

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

しかし、なぜ?

GStringImplの実装は明らかに、 と同じ文字を含むequalsが渡されたときにtrue を返すように記述できます。一応、これは合理的なことのように思えます。Stringthis

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

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

の実装はString.equals(Object other)、 a が渡されたときに常に false を返すGSStringImplため、GStringImpl.equals(Object other)any が渡されたときに true を返す場合String、対称要件に違反しています。

于 2012-03-13T10:52:22.247 に答える
55

groovyではa == b、最初にメソッドをチェックし、メソッドが存在するかどうかcompareToを使用します。それ以外の場合はを使用します。a.compareTo(b) == 0compareToequals

StringsとGStringsが実装されComparableているため、compareTo使用可能なメソッドがあります。

次のように、予想どおりにtrueが出力されます。

println "${'test'}".compareTo('test') == 0

の動作は==Groovy言語ドキュメンテーションに文書化されています:

Javaでは==、プリミティブ型の同等性またはオブジェクトのIDを意味します。Groovy==では、すべての場合において平等を意味します。これは、オブジェクトのa.compareTo(b) == 0同等性を評価する場合などに変換されます。ID(参照の同等性)を確認するには、次の方法を使用します。Groovy 3からは、演算子(または否定バージョン):(または)を使用することもできます。Comparablea.equals(b)isa.is(b)===a === bc !== d

演算子の完全なリストは、演算子のオーバーロードに関するGroovy言語ドキュメンテーションに記載されています。

オペレーター 方法
+ a.plus(b)
- a.minus(b)
* a.multiply(b)
/ a.div(b)
% a.mod(b)
** a.power(b)
| a。または(b)
& a。および(b)
^ a.xor(b)
as a.asType(b)
a() 呼び出し()
a[b] a.getAt(b)
a[b] = c a.putAt(b、c)
a in b b.isCase(a)
<< a.leftShift(b)
>> a.rightShift(b)
>>> a.rightShiftUnsigned(b)
++ a.next()
-- a.previous()
+a a.positive()
-a a.negative()
~a a.bitwiseNegate()
于 2012-03-13T10:44:21.973 に答える