Kotlin学习(3)可空类型和类型系统,vivoandroid面试

Java中的用Optional中的orElse来判空,但是使用起来不美观。

Kotlin中使用了 ?.安全调用符?:Elvis操作符。举一个例子:

fun main(args: Array){

println(getLength(null))

println(getLength(“hello”))

}

fun getLength(s: String?):Int{

return s?.length ?: 0 //如果s不为空,就返回 s.length,否则就返回0

}

3. 安全操作符

==========================================================================

null的类型是 Nothing?

在Kotlin中,多使用 ?,就可以免去很多判空的操作:

val str:String = null //编译报错,因为String不能为空

var nullStr:String? = null //编译通过

null == null //返回true

null is Any //返回false

null is Any? //返回true

var a = null

a //输出null

a = 1 //编译报错,因为null的类型Nothing? 而1是Int,不能向上转型

我们不能用可空类型来直接调用它的属性或方法,例如下面代码直接报错:

nullStr.length //编译报错

nullStr?.length //要用安全调用符 ?. 编译才正确

!!非空断言使得可空类型对象可以调用成员方法或者属性:

nullStr = null

nullStr!!.lenth //如果nullStr为空,则抛出空指针异常

…Expection

4. 特殊类型

=========================================================================

4.1 Unit类型


Kotlin中的Unit类型实现了和Java中void一样的功能

下面是Unit的定义

public object Unit{ //Unit类型是一个object对象类型

override fun toString() = “kotlin.Unit” //如果println输出对象类型,就是"kotlin.Unit"

}

当一个函数没有返回值的时候,我们就用Unit,**并且不需要显示的返回Unit、或者声明一个函数的返回类型为Unit

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

**。

编译器会推断它,所以Unit对我们来说相当是缺省的。

4.2 Nothing与Nothing?类型


在Java中,如果你想让一个函数返回值永远是null,那你可把函数的返回类型写成是 void的装箱类 Void,并返回null

而这个Void就对应Kolin中的Nothing?,其唯一可被访问的返回值也是null

在Kotlin系统类型中,Nothing是最底层,其构造函数时private的,说明其不能被实例化。

**如果一个函数的返回值是Nothing,这代表这个函数永远都不会有返回值。**和Java的void一样

我们可以在返回值为Nothing的函数去抛出异常

Nothing和Unit的区别:

Unit是有返回类型Unit

而Nothing是没有任何返回类型的

Nothing和Nothing?的区别:

Nothing?类型除了 null,其他都不能赋值。

Nothing不能赋值。

4.3 Any与Any?类型


Any?是可空类型层次的根,Any?是Any的父类。

1 is Any //Int类型的1是Any

true

1 is Any? //Int类型的1是Any?

true

null is Any //null不是Any类型

false

null is Any? //null是Any?

true

Any() is Any? //Any()是Any?类型

true

5. 类型检测与类型转换

==============================================================================

在一般情况下,不需要在Kotlin中使用显示转换操作符,因为编译器会用is检查并且在需要时自动转换。

5.1 is运算符


is运算符可以检查对象A是否与特定的类型X兼容(A是X类型或者 是X类型的派生类),和Java中的instanceOf()差不多

在kotlin中,我们可以使用 is,也可以使用 !is

5.2 类型自动转换


在kotlin中的自动转化是这个姿势的:

fun strlen(ani: Any): Int {

return when (ani) {

is String -> ani.length

is Number -> ani.toString().length

is Char -> 1

is Boolean -> 1

else -> {

print(“Not a string”)

-1

}

}

}

val len = strlen(“abc”)

print(len) //3

val lens = strlen(1)

print(lens) //1

5.3 as运算符


as运算符用于执行引用类型的显式类型转化

如果转换类型兼容则转换成功,否则 使用 as? 运算符就会返回null

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值