Chapter 11 《Scala's Hierarch
2018-06-14 本文已影响2人
liqing151
- 所有类都继承成一个类,
Any。Any中定义的方法是全类型的,它们可以在任何对象上被调用。Scala还定义了Null和Nothing,本质上是作为通用的子类存在的。Nothing是每一个类的子类。
- 所有类都继承成一个类,
-
Any下面还有两个比较大的超类,AnyVal和AnyRef。
-
- 在
Scala中存在的方法有:==,!=,equals,##,hashCode,toString。##和hashCode是一样的功能。==和!=在Any中被声明为是final的,不能被子类重写。值类的超类是AnyVal,有Boolean,Char,Byte,Int,Double,Short,Float,Long和Unit,这些类不能使用new来创建新的实例。这些类是声明为abstract以及final的。抽象的无法创建,final无法继承。值类之间是扁平关系,没有继承的关系。不同的值类类型之间存在隐式的转换。
- 在
-
AnyRef只是java.lang.Object的一个别名。
-
基本类型的实现机制
- 在
Scala中使用32位的字来存放整数。Scala在任何需要将整数当做Java对象时,都会启动备选的java.lang.Integer类。
- 在
-
Scala中的==被设计为对于类型的实现是透明的。对于值类对象,比较的是自然相等性,数值或者布尔值。对于其他的引用类型,==被处理为从Object类继承的equals方法。这个方法本来是用于引用相等性的,但许多子类都重写了这个方法来实现自然相等性。如果需要使用引用相等性,AnyRef定义了一个方法为eq,对应的是ne。
-
底类型
-
Null和Nothing是被用来统一处理某些边界情况的特殊类型。
-
-
Null类的一个实例是null,是每个引用类的子类,不兼容值类。Nothing是类继承关系的底部,是每个其他类型的子类型,并不存在这个类型的任何值。Nothing是所有类的子类,用来处理非正常终止的信号,可以非常灵活的用在if条件语句中,模式匹配中等。
-
定义自己的值类型(目前还不明白用途)
- 可以定义自己的值类对内建的值类进行扩充,通常会编译成为那种不使用包装类的字节代码。会自动拆箱和装箱。
- 只有特定的类可以成为值类,值类必须有且仅有一个类参数,并且在内部除了
def不能有其他定义,而且不能被继承,不能重新定义equals和hashCode。需要继承Anyval,类参数需要添加val变成类字段。
- 只有特定的类可以成为值类,值类必须有且仅有一个类参数,并且在内部除了
class Dollars(val amount: Int) extends AnyVal { override def toString() = "$" + amount } scala> val money = new Dollars(1000000) money: Dollars = $1000000 scala> money.amount res16: Int = 1000000
money指向一个该值类的实例,在源码中的类型为Dollar,但是在编译后的Java字节码中直接使用Int。
避免类型单一化
- 对每个领域概念定义一个新的类,复用相同的类用作不同的用于也是可行的。即便是使用细微类型(没有字段,没有方法),可以借助编译器检查错误。例如多个字段是同一类型,无法从编译器角度检测错误。
def title(text: String, anchor: String, style: String): String = s"<a id='$anchor'><h1 class='$style'>$text</h1></a>" scala> title("chap:vcls", "bold", "Value Classes") res17: String = <a id='bold'><h1 class='Value Classes'>chap:vcls</h1></a>
对每一个领域定义一个类。
class Anchor(val value: String) extends AnyVal class Style(val value: String) extends AnyVal class Text(val value: String) extends AnyVal class Html(val value: String) extends AnyVal def title(text: Text, anchor: Anchor, style: Style): Html =new Html( s"<a id='${anchor.value}'>" + s"<h1 class='${style.value}'>" + text.value + "</h1> </a>") scala> title(new Anchor("chap:vcls"), new Style("bold"), new Text("Value Classes")) <console>:18: error: type mismatch;