美文网首页KotlinKotlinKotlin精讲-黑马程序员(原创)
kotlin精讲-第2章(7)is、!is、as、as?运算符

kotlin精讲-第2章(7)is、!is、as、as?运算符

作者: 739c8d412b4c | 来源:发表于2017-12-04 09:36 被阅读308次

    Kotlin相比于Java

    相比于java 描述
    方式更多 类型检查,除了提供了is运算符还提供了!is运算符
    更智能 类型检查,会进行变量类型的智能转换
    方式更多 类型转换,提供了as运算符和as?运算符
    更安全 类型转换,使用as?运算符可以避免转换异常

    目标

    目标 知识点
    掌握 is和!is运算符的使用
    掌握 as和as?运算符的使用

    类型检查(is和!is运算符)

    回顾Java中instanceof

    在Java 中,instanceof 运算符用来在运行时检测对象是否是特定类的一个实例。基本格式如下:

    boolean result = someObj instanceof Classs
    

    result,返回结果,true表示是Class的实例,false表示不是Class的实例;

    someObj,必选项,任意对象;

    Class,必选项,任意对象类;

    我们编写一个简单案例,回顾下instanceof运算符的使用,参考代码:

    针对以上代码,我们注意第18行,我们把object当做字符串使用,这个地方进行了类型的强制转换。

    is运算符和!is运算符

    在Kotlin中,可以使用is运算符用来在运行时检测对象是否是特定类的一个实例。基本格式如下:

    result,返回结果,true表示是Class的实例,false表示不是Class的实例;

    someObj,必选项,任意对象;

    Class,必选项,任意对象类;

    我们编写一个简单案例,看看is运算符的使用,参考代码:

    针对以上代码第4行代码,直接使用了String类的length方法。!is是一个与is操作符相对应的操作符,也就是类型不匹配的意思。我们直接参考代码,代码如下:

    针对以上代码第2行使用了!is运算符。第6行代码,直接使用了String类的length方法。

    智能转换

    如果使用了is或者!is运算符,Kotlin就会对类型进行智能转换,不用像Java还需要进行强转类型转换,我们看到之前的代码,obj没有转换为String类型,直接调用了String类的length方法。

    总结起来,在if语句、else语句、逻辑或、逻辑与、when表达式都能感受到is和!is运算符带来的智能转换,参考代码:

    强制转换: as和as?运算符

    我们看到,智能转换后,就可以调用某一个类的特定方法。我们还可以通过as和as?运算符强制类型转换,然后调用对应类的对应方法,我们参考如下案例:

    针对以上代码第3行完成了类型的转换,第4行我们在使用String类的length方法的时候IDE没有提示错误。代码也成功的输出了结果。

         我们对变量a的值稍作改变转换,再看如下结果:
    

    针对以上代码第3行完成了类型的转换,第4行我们在使用String类的length方法的时候IDE同样没有提示错误。但是,代码在运行的时候就提示了类型转换异常。甚至,IDE在as关键字的地方,也有相应的提示,参考截图:

    到这里,我们得到两个结论。第一,Kotlin里面,Int类型不能使用as转换为String类型。第二,使用as运算符进行类型转换,如果转换错误,会抛出异常。

    “?.”运算符,是kotlin提供的安全的类型运算符,使用“?.”进行类型转换的时候,如果转换失败,则会返回null,而不会抛出异常,参考代码:

    针对以上代码第3行进行类型转换的时候使用了安全转换符“?.”。通过运行结果,我们得到两个结论,第一, Int类型变量不能通过安全转换符“?.”转换为String类。但是Int确实无法转String,所以返回了null。

    相关文章

      网友评论

      • 4f08367382ac:伍老师,as第一个例子中的5本身就是字符串类型,它转换成字符串没有必要啊。
      • 段子神回复:你用的是IDEA吗?按照你的例子我怎么都是错误
        739c8d412b4c:@再见无名 都是idea

      本文标题:kotlin精讲-第2章(7)is、!is、as、as?运算符

      本文链接:https://www.haomeiwen.com/subject/roetixtx.html