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。
网友评论