kotlin 类型系统

Nullability

引入可空性,将运行时错误转化编译时错误。java

Nullable types(可空类型)

安全调用操做符: ?.

该操做符组合空处理和方法调用。若是是null跳过该方法调用,返回null值。安全

elvis操做符: ?:

若是第一个值不为空返回该值,不然返回第二个值ide

安全造型: as?

若是不匹配就返回null函数

非空断言: !!

foo!!,若是foo为空就抛出NPEthis

let函数

let函数使咱们更加处理传递给函数的空参数,确保它是非空参数。spa

fun sendEmailTo(email: String) {     
    println("Sending email to $email")
}
>>> val email: String? = ...
>>> sendEmailTo(email)
ERROR: Type mismatch: inferred type is String? but String was expected

若是传递一个空参数会错误,若是咱们使用let函数就能轻松的处理。code

email?.let { email -> sendEmailTo(email) }
//更加简单的写法
email?.let { sendEmailTo(it) }

若是email不为空才传递到要求非空参数的函数。ci

late-initialized属性

kotlin的类须要初始化全部的属性,若是咱们不能提供初始化值,将其设置为可空值,初始化为null时,每次改属性都须要使用?.或!!操做符。hash

为了解决这一问题,kotlin提供了lateinit关键词来延迟初始化属性,若是咱们访问该属性却没有初始化时会报异常 "lateinit property myService has not been initialized"it

空类型的扩展

kotlin中的this能够为null值,因此有许多空类型的扩展函数使用它处理null的状况。
例如kotlin中String?的扩展方法:

/**
 * Returns `true` if this nullable char sequence is either `null` or empty or consists solely of whitespace characters.
 */
@kotlin.internal.InlineOnly
public inline fun CharSequence?.isNullOrBlank(): Boolean = this == null || this.isBlank()

可空的类型参数

默认,全部的类和函数参数的都是可空。一个类型参数能够取代任意类型,包括空类型,这种状况,声明使用类型参数做为可空类型,例如咱们生存参数类型T没有在后面标记问好。

fun <T> printHashCode(t: T)
{ println(t?.hashCode())
}
>>> printHashCode(null)
null

上面T表明Any?,因此它的值能够为Null,明确使T为非空时,必需要使用<T: Any>

原始和其余基础类型

原始类型:Int,Boolean...

多数状况下,变量、属性、参数、和返回类型,kotlin的Int类型编译成java的int原始类型。
原始类型Int做为泛型函数参数时会编译成对应的java包裹类型。
例如:Int做为集合类型参数,集合将会保存java.lang.Integer类型,对应的包裹类型。

可空原始类型: Int?、Boolean?、

Any和Any?: 根类型

Unit类型: kotlin的void类型

Kotlin的Unit类型在函数中的使用等于java的void。表示没有返回值。
主要区别是Unit能够做为类型参数。Unit类型只有一个值存在,也成为Unit在函数中隐式返回。在重载一个函数返回泛型参数时能够使函数返回Unit类型。

interface Processor<T>
{ fun process(): T
}

class NoResultProcessor : Processor<Unit>
{ override fun process() { //不须要明确返回Unit类型
// do stuff
}
}

Nothing :函数没有返回值

fun fail(message: String): Nothing
{ throw
IllegalStateException(message)
}

注意:函数返回Nothing能够做为Elvis操做符右边处理条件确认:

val address = company.address ?: fail("No address")
println(address.city)
相关文章
相关标签/搜索