第5章 自适应类型

静态类型,又称编译时类型检查,会帮助我们在编译时定义和校验接口契约。Scala不同于其他一些静态类型语言,它并不指望我们提供冗余的类型信息。大多数情况下,人们甚至无需指定类型,当然也就谈不上重复了。同时,Scala会在编译时推演类型,校验引用的使用是否得当。下面我们用一个例子来探索这一点:

SensibleTyping/Typing.scala

  1. var year: Int = 2009
  2. var anotherYear = 2009
  3. var greet = "Hello there"
  4. var builder = new StringBuilder("hello")
  5. println(builder.getClass())

这里显式地将变量year的类型定义为Int,此外还定义了一个变量anotherYear,其类型为Int,是Scala根据给变量赋的值推演得到的。类似的,Scala还推演出greet的类型为Stringbuilder的类型为StringBuilder。我们可以查询builder,看它所引用的类型是什么。如果尝试把其他类型的值或实例赋给这些变量的话,会报出编译错误。Scala的类型推演没有太多的繁文缛节①,没有很高的学习曲线;只需撤销(undo)一些Java实践即可。

①参见附录A。

Scala的静态类型会在两个方面帮助我们。首先,编译时类型检查会给予我们信心,通过编译的代码在一定程度上达到了预期效果②。其次,有助于我们以一种编译器可校验的格式表达对API的需求。

②我们会看到,这无法适应单元测试,但是编译器的支持可以当作对代码的初级测试。

在本章里,我们会学到Scala的自适应静态类型以及类型推演,还会看到Scala里3个特殊的类型:AnyNothingOption