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;