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

非空类型

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

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

    它会提示你必须初始化?,当然也有方法也可以延迟初始化的时机,让你不必在一开始就初始化,但是本质上变量还是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,则抛出异常

kolin学习笔记:非空类型与可空类型相关推荐

  1. Kolin学习笔记十-kotlin与java互操作

    Kolin学习笔记十 kotlin与java 可空性 互操作性 @JvmName @JvmFiled @jvmoverloads @jvmstatic 异常捕捉 函数类型操作 kotlin与java ...

  2. Java快速入门学习笔记2 | Java语言中的基本类型

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  3. MATLAB学习笔记04—MATLAB的字符与字符串类型

    MATLAB学习笔记 第4章字符和字符串类型 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 MATLAB学习笔记 一.字符串属性示例 二.字符串数组的索引 三.字符串中的 ...

  4. C#学习笔记(六):可空类型、匿名方法和迭代器

    可空类型 为啥要引入可空类型? 在数据库中,字段是可以为null值的,那么在C#中为了方便的操作数据库的值,微软引入了可空类型. 声明可空类型 我们可以使用两种方法声明一个可空类型: 1 Nullab ...

  5. Python入门:对Excel数据处理的学习笔记【第四章】字符串类型处理技术

    注:该学习笔记是根据曾志贤老师编写的<从Excel到Python,用Python轻松处理Excel数据>所学习整理的笔记. 第四章 字符串类型处理技术 目录 第四章 字符串类型处理技术 一 ...

  6. Python入门:对Excel数据处理的学习笔记【第五章】列表类型处理技术

    注:该学习笔记是根据曾志贤老师编写的<从Excel到Python,用Python轻松处理Excel数据>所学习整理的笔记. 第五章 列表类型处理技术 列表是Python中最基础的数据结构. ...

  7. fetchxml 汇总_Dynamic CRM 2013学习笔记(十七)JS读写各种类型字段方法及技巧

    我们经常要对表单里各种类型的字段进行读取或赋值,下面列出各种类型的读写方法及注意事项: 1. lookup 类型 清空值 var state = Xrm.Page.getAttribute(" ...

  8. 5G NR - RACH学习笔记3 - RACH的两种接入类型

    CBRA(Contention Based - 基于竞争的随机接入) 基于竞争的RACH过程如下: 1) UE --> NW : MSG1(RACH Preamble, RA-RNTI-) 2) ...

  9. Go 学习笔记(32)— 类型系统(命名类型、未命名类型、底层类型、类型强制转换、类型别名和新声明类型)

    1. 命名类型和未命名类型 1.1 命名类型 类型可以通过标识符来表示,这种类型称为命名类型( Named Type ). Go 语言的基本类型中有 20 个预声明简单类型都是命名类型, Go 语言还 ...

最新文章

  1. python-数据类型之列表
  2. 给喜欢写博、乐于交流的你们!
  3. 使用Git向GitHub上传代码
  4. 常用的php开发工具有哪些?
  5. oem718d 基准站设置_RTK基站设置、7参数、测点、放线等操作教程,文末有视频
  6. leetcode383. 赎金信
  7. 看面试题感觉生疏的知识点
  8. python程序异常实例_Python werkzeug.exceptions方法代码示例
  9. 高性能的 socket 通讯服务器(完成端口模型--IOCP)
  10. pyspider all 只启动了_Python 爬虫:Pyspider 安装与测试
  11. iOS面试题06-其他
  12. .net core读取appsettings.json配置信息、自定义json文件、自定义xml文件
  13. eyoucms栏目类型介绍
  14. 视频教程-C# 实战项目——快递单打印软件-C#
  15. 暖心的坚果 Pro 3发布会,Smartisan OS亮点颇多
  16. StarUML for Mac(UML软件建模器)
  17. 高等数学笔记-乐经良老师-第四章-微分中值定理和导数的应用-第五节-曲线的曲率
  18. Vue 2.0 商业案例一则-姜威-专题视频课程
  19. 【JavaSE】网络编程(606~630)
  20. asp毕业设计——基于asp+access的档案管理系统设计与实现(毕业论文+程序源码)——档案管理系统

热门文章

  1. android win10 投屏,安卓手机投屏WIN10电脑为什么一直不成功
  2. 数据中心意义和解决方案(绿色数据中心)
  3. UIcollectionView实现类似于超级课程表界面
  4. urllib.unquote()
  5. project facets中没有dynamic_同人界王牌quot;东方Projectquot;又增爆款?首日Steam畅销前十、好评97%...
  6. Linux驱动学习之:WDT(watchdog)驱动
  7. jsp无法编译java_org.apache.jasper.JasperException:无法为JSP编译类:
  8. O2O平台模式为什么需要接入分账系统?
  9. 特别困的学生 (特困生)
  10. 服务器ftp文件夹权限设置密码,ftp 打开服务器文件夹权限设置