第5章 自适应类型
静态类型,又称编译时类型检查,会帮助我们在编译时定义和校验接口契约。Scala不同于其他一些静态类型语言,它并不指望我们提供冗余的类型信息。大多数情况下,人们甚至无需指定类型,当然也就谈不上重复了。同时,Scala会在编译时推演类型,校验引用的使用是否得当。下面我们用一个例子来探索这一点:
SensibleTyping/Typing.scala
var year: Int = 2009
var anotherYear = 2009
var greet = "Hello there"
var builder = new StringBuilder("hello")
println(builder.getClass())
这里显式地将变量year
的类型定义为Int
,此外还定义了一个变量anotherYear
,其类型为Int
,是Scala根据给变量赋的值推演得到的。类似的,Scala还推演出greet
的类型为String
,builder
的类型为StringBuilder
。我们可以查询builder
,看它所引用的类型是什么。如果尝试把其他类型的值或实例赋给这些变量的话,会报出编译错误。Scala的类型推演没有太多的繁文缛节①,没有很高的学习曲线;只需撤销(undo)一些Java实践即可。
①参见附录A。
Scala的静态类型会在两个方面帮助我们。首先,编译时类型检查会给予我们信心,通过编译的代码在一定程度上达到了预期效果②。其次,有助于我们以一种编译器可校验的格式表达对API的需求。
②我们会看到,这无法适应单元测试,但是编译器的支持可以当作对代码的初级测试。
在本章里,我们会学到Scala的自适应静态类型以及类型推演,还会看到Scala里3个特殊的类型:Any
、Nothing
和Option
。