
2.1.2 变量类型规范是可选的
Kotlin是静态类型的,但这并不意味着你必须指定变量类型的详细信息。静态类型意味着在编译时验证变量的类型并保证类型的完整性。
Kotlin具有智慧——类型推断,可根据上下文确定变量的类型。让我们定义一个不指定类型的变量,然后询问该变量的类型。

::class调用请求变量引用的对象的Kotlin类。然而,.javaClass调用请求底层的Java类。Kotlin类和Java类很少有区别——只有Kotlin编译器非常熟悉的类才会显示这种差异。
在前面的示例中,Kotlin的类型推断能力根据分配给它的值确定greet的类型是String。输出显示了下列详细信息:

有些开发人员害怕类型推断,他们想知道这是否是运行时的事情,是否在某种程度上降低了编译时类型检查的效率。回答是否定的,很简单。
公平地说,上面的代码揭示了在运行时所引用的对象的类型,但是在编译时变量greet的类型是什么?我们可以通过在代码中犯错误来发现,比如:

Kotlin在编译时确定greet的类型是String,因此知道给它分配整数是无效的。此外,重新赋值给val是不允许的。因此代码没有执行并导致编译错误,即使它是作为脚本运行的。由此产生的编译错误有:

Kotlin没有将类型推断发挥到极致——它只允许在类型明显的地方忽略类型细节。在定义函数和方法时,需要指定参数的类型,但可以省略返回值的类型。通常,为那些不在库内部但对外部用户可见的API指定返回类型。我们将在探索如何创建函数时对此做进一步的讨论。
对你来说,鼓励你的同事给变量起有意义的名字,这样就更容易识别变量的类型和意图。例如val taxRate=0.08就优于val t=0.08。
另外,在使用类型推断时,不要急于将类型信息嵌入变量名中——这样做是程序员为了弥补没有指定他们所习惯提供的类型。例如,应避免下列情况:

局部变量是内部的,代码用户看不到。因此,类型推断的使用不会从函数用户那里拿走任何细节。在可能的情况下,省略类型细节,而是使用描述性的类型推断,但不一定是很长的变量名称。