1-5空类型和智能类型转换

2017-12-28  本文已影响0人  前端1号站

空类型安全问题
判断值是否为空,如果为空,则直接返回空,否则,返回相应值

fun getName():String?{
       return null                     
}
问号的意思是允许为空
fun main(args:Array<String>){

null类型

val name=getName()
println(name?.length)
判断name是否为空,为空就输出Null
}

声明可null类型但本身不为null

val value:String?="heloword"
-->
println(value!!.length)
告诉编译器,我知道他不为null,编译器可以继续往下走。
或者
if(value!=null)
println(value.length)

智能类型转换
声明对象
val parent:Patent=Child()
parent类型是Child的一个实例
if(parent is Child){
printIn(parent.name)
}

安全类型转换加?
val parent:Parent=Parent()
val child:Child?=parent as Child
相当于Java的强转类型。在这里加了问号是可null类型,那么,编译的时候就会出错。
解决方法是
val child:Child?=parent as? Child;
意思是如果child为null就返回null,这就避免了出错。

小结
1)任意类型都有可空和不可空的两种
编译器判断

->val notNull:String=null (X) 不能为空
->val nullable:Stirng?=null 可以为空
->notNull.length 不为空值可以直接运行
->nullable.length (X)可能为空,不能获取它的长度
->nullable!!.length 强制认定它不为空
->nullable?.length 若为空,则返回null

智能类型转换
java 类型转换

val sub:SubClass=parent as SubClass
类似Java的类型转换,失败则抛异常

安全类型转换

val sub:SubClass?=parent as?SubClass
如果转换失败,返回null,不抛异常。

if(parent is SubClass)parent<子类的成员>)
编译器尽可能推到类型,远离无用的类型转换
if(nullable!=null)nullable.length
这是对的,因为我们知道nullable不为空,它不为空则才能继续执行代码块。




上一篇下一篇

猜你喜欢

热点阅读