编程语言
119
省去变量类型
在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() }
使用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) }