第11章 scala的继承关系
1 scala的类继承关系
scala继承关系的顶部是Any(源码位于src\library-aux\scala\Any.scala)类,定了如下方法
final def ==(that: Any): Boolean = this equals that
final def != (that: Any): Boolean = !(this == that)
def equals(that: Any): Boolean
final def ##(): Int = sys.error("##")
def hashCode(): Int
def toString(): String
final def getClass(): Class[_] = sys.error("getClass")
final def isInstanceOf[T0]: Boolean = sys.error("isInstanceOf")
final def asInstanceOf[T0]: T0 = sys.error("asInstanceOf")
scala程序中每个对象都可以用 == 、!= 或 eqauls 来进行比较,用 ## 或 hashCode 做哈希,以及用toString 做格式化,==方法本质上讲等同于equals,而 != 一定是 equals 的反义
object EqualsTest {
def main(args: Array[String]): Unit = {
val c1 = C(1000);
val c2 = C(1000);
println(c1.equals(c2))
}
}
class C(val id: Int) {
//== 默认继承了 Object equals,方法重写equals方法比较值相等,
override def equals(obj: Any): Boolean = obj.isInstanceOf[C] && obj.asInstanceOf[C].id == id;
}
object C {
def apply(id: Int): C = new C(id)
}
- 在 java 中,new Integer(1) 并不 equals new Long(1),由于 scala 跟 java 相比是更规则的语言,我们在实现时有必要将这些类的 == 做特殊处理,来解决这个差异。同理,## 方法提供了scala版本的哈希算法,跟 java 的hascode