符号 | 含义 | 说明 | 示例 |
---|---|---|---|
Int | 非空类型 | val x : Int = 10 | |
Int? | 可空类型 | val x : Int? = null | |
Int! | 不确定类型 | 不确定是否非空 可以赋值给非空类型,也可以赋值给可空类型 这个类型无法主动使用,只是兼容其它语言的一种方式 只能在Kotlin调用其它语言时,由编译器进行提示 | |
?. | 非空则执行 | 非空则执行语句,返回执行结果,否则返回null | callback?.doCallback() |
!! | 断言非空 | 断言值非空,如果为空,则抛出空指针 相当于Java中的assert(this != null) | val user = getUser()!! |
?: | 为空指定替代值 | 为空时,返回一个指定的非空替代值 | val user = getUser() ?: DefaultUser |
Any | 任意类型 | 在kotlin中,任意对象都是Any 不管是基本类型,对象类型,还是函数类型 相当于Java中的Object,但是比Object覆盖范围更广 在kotlin中,原则上是不给使用Object的 Any也是区分非空和可空的,null只赋值给Any?类型 | |
object | 单例类型 | 既是类型,同时也是该类型的唯一对象 | object X val x : X = X |
Unit | 空类型 | 相当于Java中的void,它是通过object类型来定义的 在Kotlin中,所有函数都有返回值 如果不需要返回值,则可以用Unit来代替 我们也可以省略它,编译器会帮我们自动补全 Unit属于object,object属于Any | fun getInt(): Unit { return Unit } |
companion object | 伴生对象 | 同类一起创建的对象,类似于Java中的静态变量 由于kotlin中的函数也算对象,所以companion也可以定义函数 注意,伴生对象只是在访问方式上类似于Java中的static 但它并不是真正的static,在Java中通过反射是无法获取的 | companion object {} |
<*> | 未知类型 | kotlin泛型中的*表示不确定泛型中的元素类型 List<*>只能获取元素,无法添加元素 因为无法确定泛型值,意味着无法保证修改时的类型安全 List<*>中获取的元素全部通过Any?类型来存储 | val list: MutableList<*> = mutableListOf(“abc”, 1, true) val item = list[0] |
<in T> | 逆变 | 可以接受当前类和父类泛型 in可以理解为input,消费一个对象 | Consumer<Apple> = Consumer<Food> |
<out T> | 协变 | 可以接受当前类和子类泛型 out可以理解为output,生产一个对象 | Producer<Food> = Producer<Apple> |
<reified T> | 具化 | 必须配合inline来使用 在编译期间,根据T的类型,智能决定执行哪段代码 | inline fun <reified T> Bundle.plus(key: String, value: T) { when(value) { is Int-> putInt(key, value) is Long -> putLong(key, value) } } |
infix fun | 中缀函数 | 通过中缀操作符的形式 来替代a.func(b)形式的代码 | fun main() { val x1 = “Age” assign 15 val x2 = “Age” mapper 15 } infix fun String.assign(other: Int) = “$this = $other” infix fun <A, B> A.mapper(b: B) = “$this = $b” |
implies | 编译器推断 | 告诉编译器,当返回某个值时,意味着某个条件成立 | @ExperimentalContracts public inline fun CharSequence?.isNullOrEmpty(): Boolean { contract { returns(false) implies (this@isNullOrEmpty != null) } return this == null || this.length == 0 } |