可空性(避免空指针异常)

/*
*这个函数的参数代表传入一个String类型变量的实例,这代表它不可以为空
*/
fun a(str:String){
println(str)
} //这样调用a()会在编译期就显示错误,因为a()的参数不可以是null
>>>a(null) //这会报错 /*
*我们可以使用 ?来手动的标注哪些变量可以为空值
*/
fun a(str:String?){
println(str)
} /*
*一旦某个变量被标注为可空,那么这个变量将不能使用一些方法,如.length()
*/
fun a(str:String?){
println(str.length) //会报错
} /*
*可以使用if来判断,这样编译器会根据上下文来得知变量不为空,但是代码会冗长
*/
fun a(str:String?){
if(str!=null){
println(str.length) //会报错
}
} /*
*安全调用运算符“ ?. ”,如果str!=null,那么会正确调用str的length方法;如果str为空,那么调用不会成立,整个表达式的值为null,所以打印null
*/
fun a(str:String?){
println(str?.length)
} /*
*Elvis运算符 “ ?: ” 如果对象为null时,用冒号后的值代替原本的值
*/
fun a(str:String?):Int{
//若不为空,返回字符串长度,若为空,返回-1
return str?.length?:-1
}

安全转换 " as? "

/*
*尝试把值转换成给定的类型,如果不合适,则返回null
*/
fun a(str:String?):Int{
println(str as? Int)
return 0
}
>>>a("1")
null

非空断言" !! "

  断言一个数据是非空的,如果是空值,就抛空指针异常。

let函数

/*
*如果str是非空的,那么调用lambda中的代码块
*如果是null,那么什么也不会发生
*/
fun a(str:String?):Int{
str?.let {
println(str.length)
}
return 0
}

延迟初始化 lateinit

/*
*在一个类声明一个属性,如果它需要在其他方法中单独初始化,可以声明一个可空类型变量使它等于null,但是这样每次使用这个变量都需要判断空值。
*另一个方法是使用lateinit延迟初始化属性
*/
class A{
lateinit var name:String fun a1(){
print(name) //这里可以直接使用,不需要空值判断。如果为null,那么会报错----lateinit property name has not been initialized
}
}

Kotlin中的数据类型

  kotlin中的Int同样可以调用方法,就像Java中的包装类那样。但Java中存在基本数据类型是因为 数值类型的保存速度 比引用类型的保存速度要快。

  所以kotlin中并没有将Int之类的类型完全等于Java中的包装类。

  kotlin在编译时,会尽量将数值变量编译成数值类型,如果数值变量被“?”指定为可空,或者是作为集合的参数,那么将会被编译成包装类。

Any 根类型

  Java中的Object类型是所有引用类型(除八种基本数据类型)的父类。

  在Kotlin中,与之想类似的是Any类型。

  但有一些不同的地方,Any是所有非空类型的超类,其包括Int,Boolean等。而可空类型则可以用“Any?”。

Unit:Kotlin中的Void

  Java中的方法如果没有返回值,则使用void修饰。Kotlin中与之对应的是Unit。

  方法中的Unit可以省略,但如果作为参数传入则不能省 fun a(value:Int -> Unit){ } .

返回值类型为nothing的方法代表这个方法永远不能正常返回,如一个死循环的方法

基本数据类型的数组使用像IntArray这样的特殊类来表示,它的参数会被编译成数值类型

Kotlin学习(5)类型系统的更多相关文章

  1. kotlin 学习感受

    目录 kotlin 学习感受 特点 优点 屎一样的缺点 总结 kotlin 学习感受 直白的说..很不好,像屎一样,本来对此抱有很大的期望和好感度,但经过一整天的学习,完全失望了,这门语言中间有各种的 ...

  2. Kotlin 学习笔记(一)

    (Kotlin 学习笔记的文档结构基本按照 Java 核心技术一书的目录排列) 基本程序设计结构 数据类型 数字 类型 宽度 Double 64 Float 32 Long 64 Int 32 Sho ...

  3. Kotlin学习笔记(9)- 数据类

    系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正.如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步! Kotlin学习笔记(1)- 环境配置 Kotlin学习笔记(2)- 空安 ...

  4. Kotlin学习快速入门(7)——扩展的妙用

    原文地址: Kotlin学习快速入门(7)--扩展的妙用 - Stars-One的杂货小窝 之前也模模糊糊地在用这个功能,也是十分方便,可以不用继承,快速给某个类增加新的方法,本篇便是来讲解下Kotl ...

  5. Kotlin学习第一课:从对比Java开始

    1. 介绍 今年初,甲骨文再次对谷歌所谓的安卓侵权使用Java提起诉讼,要求后者赔偿高达90亿美元.随后便传出谷歌因此计划将主力语言切换到苹果主导的Swift,不过这事后来没了跟进. 但谷歌在这两天的 ...

  6. kotlin学习-初次见面

    第一次相识 最近看了很多介绍kotlin的文章.怀着好奇心改造了之前用java写的一个工具jar包.功能不是很复杂,类也只有几个,却足足写3个小时.期间一边看教程,一边写,有一种找回原来第一次写代码的 ...

  7. kotlin学习笔记-异常好玩的list集合总结

    不积跬步无以至千里,不积小流无以成江海 先看看Kotlin中for循环的遍历 fun testList(){ var StringVal = "12_12_13_15_a_b_c_d_yu_ ...

  8. kotlin学习(二)——类

    Kotlin中的类遵循一个简单的结构.尽管与Java有一点细微的差别.你可以使用try.kotlinlang.org在不需要一个真正的项目和不需要部署到机器的前提下来测试一些简单的代码范例. 1. 怎 ...

  9. kotlin学习三:初步认识kotlin(第二篇)

    上一章熟悉了kotlin基本的变量和函数声明,并明白了如何调用函数.本章再来看一些其他有用的东西 包括: 1. kotlin代码组织结构 2. when语法 3. 循环迭代语法 4. try表达式 1 ...

随机推荐

  1. JMS学习十一(ActiveMQ Consumer高级特性之独有消费者(Exclusive Consumer))

    一.简介 Queue中的消息是按照顺序被分发到consumers的.然而,当你有多个consumers同时从相同的queue中提取消息时, 你将失去这个保证.因为这些消息是被多个线程并发的处理.有的时 ...

  2. java实现微信小程序服务端(登录)

    微信小程序如今被广泛使用,微信小程序按照微信官网的定义来说就是: 微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验. 这就是微信小程序的魅力所在,有 ...

  3. Json-lib 的学习笔记

    json 按照我的理解来说,就是一个字串表,可以用来表示对象的字符串,也可以用来表示数组.它比 xml 文件节省了很多标签的内容. 关于什么是 json,在这里我们就不过多介绍了. Json-lib ...

  4. 运行Spark官方提供的例子

    去spark官网把spark下载下来: https://spark.apache.org/downloads.html 解压,可以看下目录: 其中examples目录下提供了java,scala,py ...

  5. 聊一聊几种常用web图片格式:gif、jpg、png、webp

    前言 在大多数的web页面中,图片占到了页面大小的60%-70%.因此在web开发中,不同的场景使用合适的图片格式对web页面的性能和体验是很重要的.图片格式种类非常多,本文仅针对几种web应用中常用 ...

  6. 为什么JPA@Modifying需要@Transactional注解

    在JPA开发中遇到一个很奇怪的问题,@Modifying需要和@Transactional配合使用才能正常使用.如下面代码所示 @Modifying @Transactional @Query(&qu ...

  7. Vue 中 双向绑定数据

    1.文本 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...

  8. java 解析上传的Excel文件

    java poi解析上传的Excel文件 package com.zhl.push.Utils; /** * @Author TAO * @ClassName ExcelData * @Descrip ...

  9. python - 代码调试的好帮手sys._getframe()

    python 的调试,令人非常忧伤,通过将输出路径打印的方式,可以提高很大的方便性: import sys #coding=utf-8 def get_cur_info(): print sys._g ...

  10. yarn.lock 是干什么的

    概述 今天本地运行尤大的vue-hackernews-2.0,使用 yarn 命令安装,报错提示 node 版本必须大于7小于9,如下所示: error upath@1.0.4: The engine ...