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









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kotlin中,有两种类型转换方式:智能类型转换和强制类型转换智能类型转换是指在特定情况下,Kotlin编译器会自动推断变量的类型,无需显式进行类型转换。这种类型转换在编译期间完成,并且只适用于不同类型之间的子类型关系。例如,当将一个子类型的对象赋值给父类型的变量时,Kotlin会自动将其转换为父类型。 另一种类型转换方式是强制类型转换,使用as和as?操作符进行。强制类型转换需要显式指定要转换的类型,并且在运行时进行类型检查和转换。当无法进行智能类型转换时,可以使用强制类型转换。需要注意的是,如果强制类型转换失败,会抛出ClassCastException异常。而使用as?操作符可以避免抛出异常,当转换失败时会返回null。 下面是一个示例代码,演示了如何在Kotlin中进行类型转换: ```kotlin fun main(args: Array<String>) { var a: Any = "1" var b: String = a as String // 强制将a转换为String类型 println(b.length) } ``` 在上述代码中,变量a的类型为Any,通过使用as操作符将其强制转换为String类型,然后可以访问String类型的属性和方法,如示例中的b.length。 总结起来,Kotlin中的类型转换智能类型转换和强制类型转换两种方式。智能类型转换适用于子类型关系,而强制类型转换使用as和as?操作符进行,可以在特殊情况下进行类型转换

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值