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

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 这样的特殊类来表示 。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 223,207评论 6 521
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 95,455评论 3 400
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 170,031评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,334评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,322评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,895评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,300评论 3 424
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,264评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,784评论 1 321
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,870评论 3 343
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,989评论 1 354
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,649评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,331评论 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,814评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,940评论 1 275
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,452评论 3 379
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,995评论 2 361