美文网首页
《Kotlin实战》- 6 Kotlin 的类型系统

《Kotlin实战》- 6 Kotlin 的类型系统

作者: Ronnie_火老师 | 来源:发表于2020-04-18 22:51 被阅读0次

6.1 可空性

kotlin 中加入了可空类型的概念,编译器强制把类型分为可空的和非空的,可空类型通过在类型后加上 ? 号来表示。

当一个类型被声明为非空时,如下

funstrLen(s:String)=s.length

这个函数中的参数被声明成 String 类型,在 Kotlin 中这表示它必须包含一个 String 实例。 这一点由编译器强制实施,如果传 null,在编译器就会报错。这样就保证了 strLen 函数永远不会在运行时抛出 NullPointerException。

可空类型并不是非空类型的包装,所有检查都发生在编译器,这意味着 kotlin 的可空类型并不会在运行时带来额外开销。

基于此,kotlin 引入了一些安全访问可空值得特殊运算符来使用可空类型

安全调用运算符:?. (如果作用在 null 上,本次调用不会执行,且整个表达式返回 null)

Elvis 运算符:?:

安全转换:as? (如果值不是合适的类型就返回 null)

非空断言:!!

let 函数:  用法:?.let {}

延迟初始化属性:lateinit

Kotiin 通常要求你在构造方法中初始化所有属性,如果某个属性是非空类型,你就必须提供非空的初始化值。否则,你就必须使用可空类型。如果你这样做,该属性的每一次访问都需要 null 检查或者 ! !运算符。

使用 lateinit 可以定义延迟初始化属性,注意,延迟初始化的属性都是 var,因为需要在构造方法外修改它的值,而 val 属性会被编译成必须在构造方法中初始化的 final 字段 。

privatelateinitvarmyService:MyService

Kotlin 为可空类型定义了方便使用的扩展函数,可以允许接收者为 null 的调用,如 isEmpty、isBlank、isEmptyOrNull、isNullOrBlank 就可以由 String ? 类型的接收者调用。

6.1.10 类型参数的可空性

...

6.3 集合与数组

注意 List<Int?> 与 List<Int>? 的区别

如果过滤掉 List<Int?> 中所有 null 值,只保留非 null 值,可以使用系统提供的 filterNotNull 方法。过滤后类型变为 List<Int>

Kotlin 把对集合的读、写接口分开,kotlin.collections.Collection 接口对集合是可读不可写的,kotlin.collections.MutableCollection 继承自 Collection 提供了添加和移除的方法,是可读写的。这样会让程序中数据发生的事情更容易理解,如果一个方法接收 Collection 而不是 MutableCollection,就知道它是不会修改集合的。

每一种 Java 集合接口在 Kotlin 中都有两种表示,一种是只读的,另一种是可变的。

一般规则是都优先使用只读接口,当需要修改集合时再使用可变接口。

因为 java 中没有不可变集合,所有当 kotlin 调用 java 的方法并传入一个不可变集合时,java 可以修改集合而破坏不可变性,所以你有责任使用正确的参数类型。同样也适用于包含非空类型元素的集合。

优先使用集合而不是数组;

kotlin 中创建数组的几种方式:

arrayof ,可带参数来初始化数组的值

arrayOfNulls:创建一个给定大小的数组,包含的是 null 元素,显然它只能用来创建包含元素类型可空的数组

Array:构造方法接收数组的大小和一个 lambda 表达式,调用 lambda 表达式来创建每一个数组元素;其中 lambda 接收数组元素下标并返回放在数组下标位置的值。

使用 toTypeArray 可以将 List 转为数组,另外,kotlin 提供了若干独立的类:IntArray、ByteArray等,每一种基本类型都对应一个。

类似的,可以使用 IntArray(5)、intArray(0,0,0,0,0)、IntArray(5){ i ->  (i+1) * (i+1)} 进行初始化,或者调用 List 的 toIntArray 方法转成数组。

kotlin 支持和集合相同的用于数组的扩展函数,比如 filter、map 等。

6.4 小结

Kotlin 对可空类型的支持,可以帮助我们在编译期检测出潜在的 NullPointerException 错误。

Kotlin 提供了像安全调用(?.)、 Elvis 运算符(?:)、非 空 断 言(!!)及 let 函数这样的工具来简洁地处理可空类型。

as?运算符提供了一种简单的方式来把值转换成一个类型,以及处理当它拥有不同类型时的情况。

Java 中的类型在 Kotlin 中被解释成平台类型,允许开发者把它们当作可空或非空来对待。

表示基本数字的类型(如 Int)看起来用起来都像普通的类,但通常会被编译成 Java 基本数据类型。

可空的基本数据类型(如 Int?)对应着 Java 中的装箱基本数据类型(如 java.lang.Integer )。

Any 类型是所有其他类型的超类型,类似于 Java 的 Object。而 Unit 类比于 void。

不会正常终止的函数使用 Nothing 类型作为返回类型。

Kotlin 使用标准 Java 集合类,并通过区分只读和可变集合来增强它们。

当你在 Kotlin 中继承 Java 类或者实现 Java 接口时,你需要仔细考虑参数的可空性和可变性。

Kotlin 的 Array 类就像普通的泛型类 ,但它会被编译成 Java数组 。

基本数据类型的数组使用像 IntArray 这样的特殊类来表示 。

相关文章

网友评论

      本文标题:《Kotlin实战》- 6 Kotlin 的类型系统

      本文链接:https://www.haomeiwen.com/subject/evgzvhtx.html