4.2 编译时类型与运行时类型

Koltin是一门强类型的、静态类型、支持隐式类型的显式类型语言。

4.2.1 弱类型(Weakly checked language)与强类型(Strongly checked language)

类型系统最主要的作用是,通过检查类型的运算和转换过程,来减少类型错误的发生。如果一个语言的编译器引入越多的类型检查的限制,就可以称这个语言的类型检查越强,反之越弱。根据类型检查的强弱,我们把编程语言分为

  • 弱类型语言
  • 强类型语言

弱类型语言在运行时会隐式做数据类型转换。
强类型语言在运行时会确保不会发生未经明确转换(显式调用)的类型转换。

但是另一方面,强和弱只是相对的。

Kotlin是强类型语言。

4.2.2 静态类型(Statically checked language)与动态类型(Dynamically

checked language)

类型检查可发生在编译时期(静态检查)或运行时期(动态检查)。这样我们将编程语言分为

  • 静态类型语言
  • 动态类型语言

静态类型检查是基于编译器来分析源码本身来确保类型安全。静态类型检查能让很多bug在编码早期被捕捉到,并且它也能优化运行。因为如果编译器在编译时已经证明程序是类型安全的,就不用在运行时进行动态的类型检查,编译过后的代码会更优化,运行更快。

动态类型语言是在运行时期进行类型标记的检查,因为变量所约束的值,可经由运行路径获得不同的标记。关于动态类型,有个很形象的说法:

当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。——詹姆斯·惠特科姆·莱利(James Whitcomb Riley,1849-1916)

Kotlin是静态类型语言。

4.2.3 显式类型(Explicitly typed language)与隐式类型(Implicitly typed language)

还有一种区分方法是,根据变量名是否需要显式给出类型的声明,来将语言分为

  • 显式类型语言
  • 隐式类型语言

前者需要在定义变量时显式给出变量的类型,而后者可以使用类型推论来确定变量的类型。

大多数静态类型语言,例如 Java、C/C++ 都是显式类型语言。但是有些则不是,如 Haskell、ML 等,它们可以基于变量的操作来推断其类型;

Scala 是静态类型语言,它使用类型推断功能来支持隐式类型。

Kotlin 跟Scala类似,它也使用类型推断支持隐式类型。但是,在一些场景下也需要显式声明变量的类型,所以我们可以说,同时也是显式类型。