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

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

非空类型

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

  • 这是非空类型的写法,其实和我们平时其他语言的写法没有什么不同,只是多了个初始化赋值
var a1: String = "a1"
  • 假如我们不初始化,会怎么样?
    在这里插入图片描述

    它会提示你必须初始化:joy:,当然也有方法也可以延迟初始化的时机,让你不必在一开始就初始化,但是本质上变量还是NotNull的,即使延迟了初始化时机,你也必须得初始化。这样好处就来了,在也不用像java中那样,在各种地方判断变量是否为null了,因为即使你对非空类型做if(a1 != null)的判断,返回的结果也永远是 true

可空类型

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

var a2: String? = null

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

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

  • 非空类型被调用时,和java中的语法一样,直接调用
  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,则抛出异常

在这里插入图片描述

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容