记得在我一开始接触
kotlin
时,听到的最多的就是kotlin
的类型安全,各种巴拉巴拉:dizzy_face:,关键就不断的夸安全,其他的却是什么也没有解释,差点还没入门,就直接放弃。虽然确实这是kotlin
的特性之一,但是听多了是真的腻啊!:scream:
非空类型
kotlin
中,默认变量是为非空类型的,这意味着创建的变量不能为null
,换另种说法就是你的变量必须初始化
- 这是非空类型的写法,其实和我们平时其他语言的写法没有什么不同,只是多了个初始化赋值
var a1: String = "a1"
- 假如我们不初始化,会怎么样?
在这里插入图片描述
它会提示你必须初始化:joy:,当然也有方法也可以延迟初始化的时机,让你不必在一开始就初始化,但是本质上变量还是NotNull
的,即使延迟了初始化时机,你也必须得初始化。这样好处就来了,在也不用像java
中那样,在各种地方判断变量是否为null
了,因为即使你对非空类型做if(a1 != null)的判断,返回的结果也永远是 true
。
可空类型
假如,我们在coding中,需要变量可空,可为null
,该如何做呢?
var a2: String? = null
没错,只需要在变量的类型后面加上?
,这样就表示a2
可以为null
。
但是可空类型在调用的时候,与非空类型是有区别的。
-
非空类型被调用时,和
java
中的语法一样,直接调用
if (a1.length === 2) {
a1="true"
} else {
a1="false"
}
-
可空类型被调用时,在调用变量的方法时必须得在后面加个
?
if (a2?.length === 2) {
a2="true"
} else {
a2="false"
}
a2?.length
代表如果a2!=null
,则返回a2.length
;如果a2==null
,则返回null
上面的kotlin
代码转换后的java
代码
String var10000 = this.a2;
if (this.a2 != null) {
if (var10000.length() == 2) {
this.a2 = "true";
return;
}
}
this.a2 = "false";
可空类型不能直接给非空类型赋值,?:
的使用
在这里插入图片描述
上述场景中,当可空类型a2给非空类型a1赋值时,会报错。因为a2可能为null,而a1不能为null,所以需要处理当a2为null时的情况,如下
class Test {
var a1: String = "a1"
var a2: String? = "a2"
fun check() {
a1 = a2 ?: "a1"
}
}
a1 = a2 ?: "a1"
中使用到了操作符?:
,咋一看感觉像java
中的三目运算符,其实他们是有所不同的。
这里表示,当a2!=null
时,a1=a2
,当a2==null
时,a1="a1"
,?:
只针对a2==null
时的情况时才选"a1"
,或者可以说?:
只能针对它前面的对象为null
时(即判断条件为前面的对象是否为null
),才能选择它后面的对象。
非空断言!!
像上面那种使用?:
的方法,有的时候对于我们来说过于臃肿与繁琐,在一些情况下,我们可以明确我们的可空对象不为空
,
那么此时就可以使用操作符!!
class Test {
var a1: String = "a1"
var a2: String? = "a2"
fun check() {
a1 = a2!!
}
}
这样,我们的代码就可以更简洁,但是如果当a2==null
时,我们使用a1=a2!!
,则会抛出空指针异常,所以使用需谨慎!以下是转换后的java
代码,可以明确看到a2==null
,则抛出异常
网友评论