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









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值