Kotlin学习笔记:类型系统

Kotlin学习笔记:概述
Kotlin学习笔记:基本语法和函数
Kotlin学习笔记:类和接口
Kotlin学习笔记:lambda编程
Kotlin学习笔记:类型系统
Kotlin学习笔记:泛型
Kotlin学习笔记:注解和反射

Null 类型处理

Kotlin类型系统解决了空指针问题。解决方式是将运行时的错误转变成编译时错误。

在Kotlin中,默认情况下,变量不能存储null引用,否则编译时报错。

fun strLen(s: String) = s.length
strLen(null) //编译不通过
  • 可null操作符(?)

若需要变量为null,可以使用操作符。一旦有一个可null类型的值,对它的操作也会受限制。

不能把它赋值给非null类型的对象

val str:String? = null
val str2:String = str // 编译不通过

也不能把可null类型的对象传给拥有非null类型参数的函数。

val str: String? = null
strLen(str) // 编译不通过

如果一定要调用strLen方法,需要将方法进行null处理

fun strLen2(s:String?):Int = if (s!=null) s.length else 0
val str: String? = null
strLen(str) // 正常运行,返回0
  • 安全调用运算符(?.)

安全调用运算符允许把一次null检查和一次方法调用合并成一个操作。

例如

str?.toUpperCase()

等价于

if (str != null) str.toUpperCase() else null
  • Elvis运算符(?:)

elvis 接收两个运算数,如果第一个运算数不为null,则返回第一个运算数;如果为null,则返回第二个运算数。

Kotlin学习笔记:类型系统_第1张图片
image.png
  • 安全转换(as?)
Kotlin学习笔记:类型系统_第2张图片
image.png
  • 非null断言(!!)
Kotlin学习笔记:类型系统_第3张图片
image.png
  • let函数

let函数可以用于处理可null表达式,它允许对表达式进行求值,并判断它是否为null。

举例

有一个发送邮件的函数

fun sendEmailTo(email: String) { /*...*/ }

调用发送邮件函数。由于email可以为null,编译不能通过。

>>> val email: String? = ...
>>> sendEmailTo(email)
ERROR: Type mismatch: inferred type is String? but String was expected

可以进行null判断

if (email != null) sendEmailTo(email)

也可以使用let函数

email?.let { email -> sendEmailTo(email) }
Kotlin学习笔记:类型系统_第4张图片
image.png

基本类型

与Java不同,Kotlin不区分基本数据类型和引用类型。在大多数情况下,Int类型会被编译为java的int类型。在一些情况下,比如作为泛型的类型参数时,会被编译为Java的Integer类型。

对应到Java基本类型的类型完整列表如下:

整数类型—Byte, Short, Int, Long
浮点数类型—Float, Double
字符类型—Char
布尔类型—Boolean

  • Any:Any类型是所有类型的父类,类似于Java的Object
  • Unit:类似于Java的void。
  • Nothing:没有任何值,只有被当做返回值使用或者当做泛型函数返回值的类型参数

集合

Kotlin 没有实现自己的集合框架,而是使用的Java的集合框架 。因此,本质上每一个Kotlin集合接口都对应着一个Java集合接口的实例。

与Java不同的是,Kotlin的集合分为两种,一种是只读集合,一种是可变集合。

Kotlin学习笔记:类型系统_第5张图片

集合创建函数列表

集合类型 只读 可变
List listOf() arrayListOf()
Set setOf hashSetOf(), linkedSetOf(), sortedSetOf()
Map mapOf hashMapOf(), linkedMapOf(), sortedMapOf()

你可能感兴趣的:(Kotlin学习笔记:类型系统)