[Scala]繼承層級和對象相等判斷(eq )
基本物件繼承關係
參考 scala for the impatient
- AnyRef 都擴展自Any類。Any類定義了,inInstanceOf、asInstanceOf。
- AnyRef 為 參考類型。所有的參考類型都繼承了<<trait>>Null和<<trait>>Notihing,固可為null或nil。
- AnyVal 為 值類型,不可為null。
- 所有的類都繼承了Any固可使用 Any類的方法。
對象相等判斷
- 使用equals及hashCode方式驗證是否相同
- 若無覆寫equals 方法,則判斷是否指向同一實體
- 覆寫equals 方法即可
- 在Scala裡面 ,符號"==來" 會先判斷null,然後再使用equals來判斷是否相等
- equals是用來判斷是否相同,而hashCode是用來判斷存放的位置。所以若要改寫請務必兩個都要改寫。
Scala:
1: class Ant {2:
3: val rang=2
4:
5: }
1: object MyApp extends App2: {
3: //定義一個匿名方法 ,在宣告Employee時建立greeting4: val ant1:Ant=new Ant5: val ant2:Ant=new Ant6: println(ant1.equals(ant2))
7: }
Result:
明明類的內容一樣就該相等,但由於沒覆寫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)false10: else that.rang==rang11: }
12:
13: //加上final的意思 是 這個判斷僅在子類(Ant這個類) 是這樣的規則14: final override def hashCode=15: {
16: rang.hashCode()*99
17: }
18:
19: }
Result:
By-藍小伙