kotlin基础五之Smart casts


  在大多数情况下,kotlin不需要使用显式转换符,编译器会自动跟踪is检查并在需要时自动插入安全的转换:

fun isString(s: Any) =
        when (s) {
            is String -> println("$s is a String, length is : ${s.length}")
            else -> println("$s no a String.")
        }

fun main(vararg args: String) {
    isString("Hello")
    isString(123)
}
//result:
> Hello is a String, length is : 5
> 123 no a String.

  在kotlin中,使用is关键字来检查对象的类型,如果你学过C#语言,你会发现这很像C#。is关键字和Java中的instanceof也很像,只不过kotlin还会进行智能转换,无需你强制进行转换。
  当然,在某种需要进行强制转换的场所,我们也有办法,那就是as操作符。这是一种不安全的转换:

fun isString(s: Any) =
        when (s) {
            is String -> {
                val hello = s as String
                println("$s is a String, length is : ${s.length}")
                println("hello as String: $hello")
            }
            else -> println("$s no a String.")
        }

fun main(vararg args: String) {
    isString("Hello")
    isString(123)
}
//result:

> Hello is a String, length is : 5 
> hello as String: Hello 
> 123 no a String.