kotlin空类型转换和智能类型转换
空类型转换
fun getName(): String?{ return null } fun main(args: Array<String>) { val name = getName() //为什么报错,因为kotlin不支持空类型 println(name.length) //?就是我知道他是空类型,然后我让他执行这个空类型,这就是类型安全转换 println(name?.length) }
空类型安全转换也可以这样写,这样的写法哪怕你写的是空对象编译器也会继续编译成功,不会直接编译失败
这是另外一种安全转换的写法,当出现需要这种方式获取长度时候就可以获取其字符串的长度
fun main(args: Array<String>) { /* val name: String = getName()?: return //为什么我又不报错了? 因为?表达的意思就是我前面的表达式如果为空就继续执行,不会报错 println(name.length)*/ val value: String ?= "dsdsadasda" //这种情况也无法获取其长度,该怎么办呢? /* println(value.length)*/ //这样的写法就是告诉编译器我知道这样写不行,但是你只管执行,然后它就能直接获取到这个字符串的长度了 println(value!!.length) }
智能类型转换
fun main() { //这就是智能转换 //Chlid2为父类,Parent2继承它的父类, //这是向下转型,父类对象的类型是子类 //这是实例化父类的对象,我现在是拿不到子类中方法的,如何去拿到呢? val chlid2 : Chlid2 = Parent2() //通过这个判断,它的意思就是说我的chlid2是Parent2实例 /*if (chlid2 is Parent2)*/ //这样就拿到子类中的方法了 println(chlid2.name()) }
首先我的父类实例化对象是拿不到子类中的方法的,呢要如何拿到呢? 通过智能转换就可以去实现子类方法 这是我子类中定义的方法: 我通过智能转换,就可以实现父类实例化对象拿到子类的方法
fun main() { //这就是智能转换 //Chlid2为父类,Parent2继承它的父类, //这是向下转型,父类对象的类型是子类 //这是实例化父类的对象,我现在是拿不到子类中方法的,如何去拿到呢? val chlid2 : Chlid2 = Parent2() //通过这个判断,它的意思就是说我的chlid2是Parent2实例 if (chlid2 is Parent2) //其放在java中就需要强转,这样 is 就是说它是不为空的类型就不需要强转了 //这样就拿到子类中的方法了 println(chlid2.name()) } 最终返回的结果就是子类中的呢个方法 ## 还有比如 **//:: Kotlin 中 双冒号操作符 表示把一个方法当做一个参数,传递到另一个方法中进行使用,通俗的来讲就是引用一个方法。 //使用 !! 时,会对对象进行非空判断,并且会像 java 代码一样抛出异常。 //?对象A ?: 对象B 表达式,意思为,当对象 A值为 null 时,那么它就会返回后面的对象 B。** val top :String? = "hello" println(top.length) //我直接获取长度是获取不到的,因为编译器不能信任这句话我们可以通过下面这个判断 //我告诉编译器它是这个可以信任的类型,就可以编译成功 if (top is String){ println(top.length) } ## 这就是另外一种智能类型转换 ## 智能类型转换——安全转换操作方式 /* * 智能转换安全,转换时不会抛出异常,如果没有加as?它会抛出类型转换异常,但是如果加了as?它会直接抛出null并不会抛出异常 * */ val ch:Chlid2 = Chlid2() val par:Parent2? = ch as? Parent2 /**/ println(par) 这段代码返回的结果为null