2017-03-17 14 views
-3

私はスカラを学習し、基礎を上っています。「スカラ==と!=メソッドでは、参照平等をチェックするJavaとは対照的に、値equaliyをチェックします」

「Scalaでは==と!=メソッドは、Javaとは対照的に、参照equalityをチェックする値equaliyをチェックする」という意味を理解できませんでした。

誰かが例を挙げて、簡単に英語で説明しようとすることができますか?

+3

。基本的なことがすべて説明されています。 – GhostCat

+0

たとえば、[Javaでは== vs equals()の違いは何ですか]と考えてみてください(詳細は、/ questions/7520432/what-is-the-the-difference-vs-equals-in-java) –

答えて

2

ケース1からvalue classesAnyVal)とスカラ座での値クラスでcase classes

==!=は、値のチェックを行います。

値クラスは、インスタンスが というオブジェクトの下にあるホストシステムによって表されないクラスです。すべての値クラスは クラスのAnyValを継承します。

スカラーのすべてのプリミティブInt,Floatなどは値クラスです。 case classes

また
scala> val quantity1 = 100 
quantity1: Int = 100 

scala> val quantity2 = 100 
quantity2: Int = 100 

scala> quantity1 == quantity2 
res9: Boolean = true 

は、== implicitily動作します。、

ケースクラスが が独占的に自分のコンストラクタの引数に依存すべき平野と不変のデータ保持オブジェクトである

scala> case class Item(name: String, quantity: Int) 
defined class Item 

今、==で2つの項目を比較すると、itemは同じ。

scala> Item("Jacket", 100) == Item("Pants", 10) 
res0: Boolean = false 

scala> Item("Jacket", 100) == Item("Jacket", 100) 
res1: Boolean = true 

ケース2 - 文献のScalaのクラス(AnyRef)とJavaクラス(java.lang.Object

しかし、あなたは==をすればRef ScalaでのクラスおよびすべてのJavaクラスと、それはインスタンスの参照をチェックする代わりに、値は自分で書くまでequals methodです。

Javaの例、

static class Item { 
     String name; 
     int quantity; 

     Item(String name, int quantity){ 
      this.name = name; 
      this.quantity = quantity; 
     } 
    } 
    public static void main(String[] args) { 
     Item item1 = new Item("Jacket", 100); 
     Item item2 = new Item("Pants", 10); 
     Item item3 = new Item("Jacket", 100); 

     System.out.println(item1 +"==" + item2 + " " + (item1 == item2)); //false 
     System.out.println(item1 +"==" + item3 + " " + (item1 == item3)); //false 
    } 

==比較結果が1b28cdfaitem1のインスタンスREFある

[email protected][email protected] false 
[email protected][email protected] false 

あろう。 item1item3は同じデータを持っていますが、==は2つの異なるアドレスを参照する2つの異なるインスタンスであるため、falseを返します。

値クラス==のスカラーを模倣するには、以下のようにequalsメソッドを実装し、手動等価チェックを実行します。

static class Item { 
    String name; 
    int quantity; 

    Item(String name, int quantity){ 
     this.name = name; 
     this.quantity = quantity; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     Item i = (Item) obj; 
     return this.name.equals(((Item) obj).name) && this.quantity == ((Item) obj).quantity; 
    } 
} 

public static void main(String[] args) { 
    Item item1 = new Item("Jacket", 100); 
    Item item2 = new Item("Pants", 10); 
    Item item3 = new Item("Jacket", 100); 

    System.out.println(item1 +".equals(" + item3 + ") " + (item1.equals(item3))); //true 
} 
方法は
scala> class Store(name: String){} //equivalent to Store extends `AnyRef` 
defined class Store 

scala> val store1 = new Store("a") 
store1: Store = [email protected] 

scala> val store2 = new Store("a") 
store2: Store = [email protected] 

scala> store1 == store2 
res7: Boolean = false 

を実装しかし、Scalaの文献のクラスで独自のequals方法がありますならば、==を意味していないに等しい場合、 `==は`参照を比較することをScalaの参考クラスと同じ

、あなたの.equalsメソッド。

例、あなたがこれらの条件をGoogleにしたい

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

class Store(val name: String){ 
    override def equals(that: Any) : Boolean = { 
     val thatStore = that.asInstanceOf[Store] 
     name == thatStore.name 
    } 
} 

scala> new Store("JWN") == new Store("JWN") // calls s1.equals(s2) 
res1: Boolean = true 

+0

説明 – jason

+0

"scala、==および!= valueチェックを行う"と "しかし、Javaでは、==を行う場合は、独自のequalsメソッドを記述するまでインスタンス参照を値の代わりにチェックする"が間違っている、二番目はいつも)。 –

+0

@AlexeyRomanov thats、それは私が作成するオブジェクトがスカラの値クラスかrefクラスかどうかによって異なります。 – prayagupd

関連する問題