[Scala]繼承層級和對象相等判斷(eq )

  • 648
  • 0
  • 2014-07-09

[Scala]繼承層級和對象相等判斷(eq )

基本物件繼承關係

image

參考 scala for the impatient

 

 

  1. AnyRef 都擴展自Any類。Any類定義了,inInstanceOf、asInstanceOf。
  2. AnyRef 為 參考類型。所有的參考類型都繼承了<<trait>>Null和<<trait>>Notihing,固可為null或nil。
  3. AnyVal 為 值類型,不可為null。
  4. 所有的類都繼承了Any固可使用 Any類的方法。

 

 

 

對象相等判斷

  1. 使用equals及hashCode方式驗證是否相同
  2. 若無覆寫equals 方法,則判斷是否指向同一實體
  3. 覆寫equals 方法即可
  4. 在Scala裡面 ,符號"==來" 會先判斷null,然後再使用equals來判斷是否相等
  5. equals是用來判斷是否相同,而hashCode是用來判斷存放的位置。所以若要改寫請務必兩個都要改寫。

 

Scala:

   1: class Ant  {
   2:  
   3:  val rang=2
   4:  
   5: }
   1: object MyApp extends App
   2: {
   3:   //定義一個匿名方法 ,在宣告Employee時建立greeting
   4:   val ant1:Ant=new Ant
   5:   val ant2:Ant=new Ant
   6:   println(ant1.equals(ant2))
   7: }

Result:

image明明類的內容一樣就該相等,但由於沒覆寫equals 方法,故因兩者為不同實體 所以equals 判斷為false。

 

 

Scala:

   1: class Ant  {
   2:  
   3:   val rang=2
   4:     
   5:  //加上final的意思 是 這個判斷僅在子類(Ant這個類) 是這樣的規則
   6:   final  override def equals(other:Any)=
   7:   {
   8:     val that=other.asInstanceOf[Ant]
   9:     if(that==null)false
  10:     else  that.rang==rang
  11:   }
  12:  
  13: //加上final的意思 是 這個判斷僅在子類(Ant這個類) 是這樣的規則
  14:   final  override def hashCode=
  15:   {
  16:     rang.hashCode()*99
  17:   }
  18:  
  19: }

 

Result:

image

  

 

 

 

By-藍小伙