3.3.1 省去变量类型
在Kotlin中大部分情况你不需要说明你使用对象的类型,编译器可以直接推断出它的类型。代码示例
fun typeInference(){
val str = "abc"
println(str)
println(str is String)
println(str::class)
println(str::class.java)
// abc
// true
// class java.lang.String (Kotlin reflection is not available)
// class java.lang.String
val d = Date()
println(d)
println(d is Date)
println(d::class)
println(d::class.java)
// Fri Jun 09 00:06:33 CST 2017
// true
// class java.util.Date (Kotlin reflection is not available)
// class java.util.Date
val bool = true
println(bool)
println(bool::class)
println(bool::class.java)
// true
// boolean (Kotlin reflection is not available)
// boolean
val array = arrayOf(1,2,3)
println(array)
println(array is Array)
println(array::class)
println(array::class.java)
// [Ljava.lang.Integer;@7b5eadd8
// true
// class [Ljava.lang.Integer; (Kotlin reflection is not available)
// class [Ljava.lang.Integer;
}
所以,我们只需要依据要产生的变量类型填写var或val,其类型通常能够被推断出来。编译器能够检测到其类型,自动地完成类型转换。当然,我们也可以明确地指定变量类型。但是,类型推断不是所有的。例如,整型变量Int不能赋值Long变量。下面的代码不能通过编译:
fun Int2Long(){
val x:Int = 10
val y:Long = x // Type mismatch
}
我们需要显式地调用对应的类型转换函数进行转换:
fun Int2Long(){
val x:Int = 10
// val y:Long = x // Type mismatch
val y: Long = x.toLong()
}
3.3.2 使用is运算符进行类型检测
is 运算符检测一个表达式是否某类型的一个实例。如果一个不可变的局部变量或属性已经判断出为某类型,那么检测后的分支中可以直接当作该类型使用,无需显式转换:
fun getLength(obj: Any): Int? {
var result = 0
if (obj is String) {
// `obj` 在该条件分支内自动转换成 `String`
println(obj::class) //class java.lang.String
result = obj.length
println(result)
}
// 在离开类型检测分支后,`obj` 仍然是 `Any` 类型
println(obj::class) // class java.lang.Object
return result
}
测试类如下
@Test
fun testGetLength() {
val obj = "abcdef"
val len = variableVSValue.getLength(obj)
Assert.assertTrue(len == 6)
val obj2:Any = Any()
variableVSValue.getLength(obj2)
}