Kotlin学习笔记:类型系统

2019-01-24  本文已影响0人  nxiangbo

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

Null 类型处理

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

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

fun strLen(s: String) = s.length
strLen(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 接收两个运算数,如果第一个运算数不为null,则返回第一个运算数;如果为null,则返回第二个运算数。

image.png image.png image.png

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) }
image.png

基本类型

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

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

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

集合

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

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

集合创建函数列表

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

猜你喜欢

热点阅读