回答:
を適切に処理することを除いて==
、通常はを使用します。参照の等価性(めったに使用されない)はです。equals
null
eq
3 == BigInt(3)
とBigInt(3) == 3
真です。しかし、3.equals(BigInt(3))
は偽ですが、BigInt(3).equals(3)
真です。したがって、を使用することをお勧めし==
ます。Scalaでの使用equals()
は避けてください。==
暗黙の変換はうまくいくと思いますが、equals()
そうではありません。
new java.lang.Integer(1) == new java.lang.Double(1.0)
true new java.lang.Integer(1) equals new java.lang.Double(1.0)
であるのでしょうか。
equals
各インスタンスのコンテンツを比較するオーバーライドメソッド。これは、equals
Javaで使用されるのと同じメソッドです。==
を気にせずに演算子を使用して比較するnull
eq
両方の引数があるかどうかを確認する方法を丁度同じ参照。これがどのように機能するかを理解していない限り使用しないことをお勧めしますequals
。そしてAnyRef
、これだけでなく、引数でのみ使用するようにしてくださいAny
注:の場合にはequals
、あなたが例えば引数に切り替える場合は、単にJavaでのように、それは同じ結果を返さないことが1.equals(BigInt(1))
返されますfalse
逆に返される場所をtrue
。これは、各実装が特定のタイプのみをチェックするためです。プリミティブ番号は、2番目の引数が型ではなく、他のプリミティブ型のみであるかどうかをチェックしNumber
ませんBigInt
このAnyRef.equals(Any)
メソッドは、サブクラスによってオーバーライドされるメソッドです。Scalaにも導入されたJava仕様のメソッド。ボックス化されていないインスタンスで使用すると、これを呼び出すためにボックス化されます(Scalaでは非表示ですが、Javaではint
->を使用するとよりわかりやすくなりますInteger
)。デフォルトの実装は単に参照を比較するだけです(Javaのように)
このAny.==(Any)
メソッドは2つのオブジェクトを比較し、どちらかの引数をnullにすることができます(2つのインスタンスで静的メソッドを呼び出す場合と同様)。両方がnull
であるかどうかを比較し、equals(Any)
ボックス化されたインスタンスのメソッドを呼び出します。
AnyRef.eq(AnyRef)
この方法は、比較のみインスタンスがメモリに配置されている参照を、。このメソッドには暗黙のボックス化はありません。
1 equals 2
返されfalse
、それがリダイレクトとして、Integer.equals(...)
1 == 2
返されfalse
、それがリダイレクトとして、Integer.equals(...)
1 eq 2
両方の引数が型である必要があるため、コンパイルされません AnyRef
new ArrayList() equals new ArrayList()
戻りますtrue
、それは内容を確認して、new ArrayList() == new ArrayList()
返されtrue
、それがリダイレクトとして、equals(...)
new ArrayList() eq new ArrayList()
false
両方の引数が異なるインスタンスであるため、が返されますfoo equals foo
が返されますがtrue
、でない場合foo
はnull
、NullPointerException
foo == foo
返されtrue
たとしても、foo
ですnull
foo eq foo
true
両方の引数が同じ参照にリンクしているため、が返されます==
およびequals
for Float
とDouble
typeの間には興味深い違いがありNaN
ます。
scala> Double.NaN == Double.NaN
res3: Boolean = false
scala> Double.NaN equals Double.NaN
res4: Boolean = true
編集:コメントで指摘されたように-「これはJavaでも発生します」- これが正確に何であるかに依存します
public static void main(final String... args) {
final double unboxedNaN = Double.NaN;
final Double boxedNaN = Double.valueOf(Double.NaN);
System.out.println(unboxedNaN == unboxedNaN);
System.out.println(boxedNaN == boxedNaN);
System.out.println(boxedNaN.equals(boxedNaN));
}
これは印刷されます
false
true
true
だから、unboxedNan
利回りfalse
これはIEEE浮動小数点数がそれをどう定義するかで、(それが何らかの形でアイデンティティの概念を台無しが)これは本当にすべてのプログラミング言語で起こる必要があるため、等しいかどうかを比較。
ボックス化されたNaNは、==
オブジェクト参照を比較しているため、Javaを使用した比較ではtrueになります。
私はequals
ケースの説明はありませんが、私見では==
ボックス化されていないdouble値と同じように動作するはずですが、実際には動作しません。
Scalaに翻訳すると、Scalaはプリミティブ型とオブジェクト型を統合しAny
、必要に応じてプリミティブdoubleとボックス型Doubleに変換するため、問題はもう少し複雑になります。したがって、スカラは==
明らかにプリミティブNaN
値の比較に要約されますがequals
、ボックス化されたDouble値で定義されたものを使用します(多くの暗黙の変換マジックが進行中で、によってdoubleにピンプされたものがありRichDouble
ます)。
実際に何かがNaN
使用されているかどうかを本当に確認する必要がある場合isNaN
: