kolin学习笔记:非空类型与可空类型

2018-11-16  本文已影响0人  码途有道

记得在我一开始接触kotlin时,听到的最多的就是kotlin的类型安全,各种巴拉巴拉:dizzy_face:,关键就不断的夸安全,其他的却是什么也没有解释,差点还没入门,就直接放弃。虽然确实这是kotlin的特性之一,但是听多了是真的腻啊!:scream:

非空类型

kotlin中,默认变量是为非空类型的,这意味着创建的变量不能为null,换另种说法就是你的变量必须初始化

var a1: String = "a1"

可空类型

假如,我们在coding中,需要变量可空,可为null,该如何做呢?

var a2: String? = null

没错,只需要在变量的类型后面加上?,这样就表示a2可以为null

但是可空类型在调用的时候,与非空类型是有区别的。

  if (a1.length === 2) {
      a1="true"
  } else {
      a1="false"
  }
 if (a2?.length === 2) {
     a2="true"
 } else {
     a2="false"
 }

a2?.length代表如果a2!=null,则返回a2.length;如果a2==null,则返回null

上面的kotlin代码转换后的java代码

 String var10000 = this.a2;
 if (this.a2 != null) {
      if (var10000.length() == 2) {
          this.a2 = "true";
          return;
      }
 }
 this.a2 = "false";

可空类型不能直接给非空类型赋值,?:的使用

在这里插入图片描述
上述场景中,当可空类型a2非空类型a1赋值时,会报错。因为a2可能为null,而a1不能为null,所以需要处理当a2null时的情况,如下
class Test {
    var a1: String = "a1"
    var a2: String? = "a2"
    fun check() {
        a1 = a2 ?: "a1"
    }
}

a1 = a2 ?: "a1"中使用到了操作符?:,咋一看感觉像java中的三目运算符,其实他们是有所不同的。
这里表示,当a2!=null时,a1=a2,当a2==null时,a1="a1"?:只针对a2==null时的情况时才选"a1",或者可以说?:只能针对它前面的对象为null时(即判断条件为前面的对象是否为null),才能选择它后面的对象。

非空断言!!

像上面那种使用?:的方法,有的时候对于我们来说过于臃肿与繁琐,在一些情况下,我们可以明确我们的可空对象不为空
那么此时就可以使用操作符!!

class Test {
   var a1: String = "a1"
   var a2: String? = "a2"
   fun check() {
       a1 = a2!!
   }
}

这样,我们的代码就可以更简洁,但是如果当a2==null时,我们使用a1=a2!!,则会抛出空指针异常,所以使用需谨慎!以下是转换后的java代码,可以明确看到a2==null,则抛出异常

在这里插入图片描述
上一篇下一篇

猜你喜欢

热点阅读