欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Chapter 11 《Scala's Hierarchy》

程序员文章站 2022-06-15 12:06:04
...
    1. 所有类都继承成一个类,AnyAny中定义的方法是全类型的,它们可以在任何对象上被调用。Scala还定义了NullNothing,本质上是作为通用的子类存在的。Nothing是每一个类的子类。
    1. Any下面还有两个比较大的超类,AnyValAnyRef
    1. Scala中存在的方法有:==,!=,equals,##,hashCode,toString##hashCode是一样的功能。==!=Any中被声明为是final的,不能被子类重写。值类的超类是AnyVal,有Boolean,Char,Byte,Int,Double,Short,Float,LongUnit,这些类不能使用new来创建新的实例。这些类是声明为abstract以及final的。抽象的无法创建,final无法继承。值类之间是扁平关系,没有继承的关系。不同的值类类型之间存在隐式的转换。
    1. AnyRef只是java.lang.Object的一个别名。

基本类型的实现机制
    1. Scala中使用32位的字来存放整数。Scala在任何需要将整数当做Java对象时,都会启动备选的java.lang.Integer类。
    1. Scala中的==被设计为对于类型的实现是透明的。对于值类对象,比较的是自然相等性,数值或者布尔值。对于其他的引用类型,==被处理为从Object类继承的equals方法。这个方法本来是用于引用相等性的,但许多子类都重写了这个方法来实现自然相等性。如果需要使用引用相等性,AnyRef定义了一个方法为eq,对应的是ne

底类型
    1. NullNothing是被用来统一处理某些边界情况的特殊类型。
    1. Null类的一个实例是null,是每个引用类的子类,不兼容值类。Nothing是类继承关系的底部,是每个其他类型的子类型,并不存在这个类型的任何值。Nothing是所有类的子类,用来处理非正常终止的信号,可以非常灵活的用在if条件语句中,模式匹配中等。

定义自己的值类型(目前还不明白用途)
    1. 可以定义自己的值类对内建的值类进行扩充,通常会编译成为那种不使用包装类的字节代码。会自动拆箱和装箱。
    1. 只有特定的类可以成为值类,值类必须有且仅有一个类参数,并且在内部除了def不能有其他定义,而且不能被继承,不能重新定义equalshashCode。需要继承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;