Kotlin
kotlin-for-android-developers-zh
密封类 sealed class
枚举类进阶版,枚举类限定有限值集合,密封类限定有限类型集合
密封类限制只能在当前文件内派生子类
默认所有类都是final类,可公开派生的类需要使用 open 修饰符定义,并在该类内部不想被覆盖的方法前添加 final 修饰符
类静态成员(伴随对象):companion object {}
var member: Type
get() =
set(value) {field = value}
field
关键词只能用于属性的访问器.
var属性有getter和setter
val属性只有getter
编译时常量属性 const val WHATEVER = "www" 定义在top-level声明
延迟属性的初始化可用lateinit var anyway: Type
懒属性val what: Type by lazy {value()}
匿名内部类
addListener(object : OnxxListener { .. })
val ab = object : A(1), B {
override val y = 14
}
val any = object { ... }
val any = object: Any() { ... }
POJO类:data class
单例对象:object whatever
通过POJO类可使用多重解构声明:
data class Point(x, y)
val (a, b) = point1
变长参数 fun fn(vararg x: Type)
反射,使用双冒号
::property // 访问顶级元素(属性、函数)
String::class // 获取到String的class类型(KClass)
val property = Object::property // 反射引用属性成员
property.get(object) // 通过反射的属性成员获取特定对象的属性值
val method = Object::methodName // 反射引用函数
method.invoke(object, args) // 指定对象调用反射的函数
val property = "123"::length // 绑定到特定对象的反射引用
property.get()
:: Foo // 反射引用类构造函数
val ref: KFunction1<String, Type> = O::method // 指定类型反射重载的函数
class类型
arg: KClass<*>
String::class // 获取到String的class类型(KClass)
匿名函数
fun(it):ReturnType { }
fun(it) = statement
lambda
(Type..) -> ReturnType // 类型签名
{x, y -> statement} // 定义
{statement} // 只有一个参数时,可省略参数,使用 it 作为默认参数名
fun(x: Int, y: Int ): ReturnType = statement // 定义文本的显式写法
fun(x: Int, y: Int ): ReturnType {statement} // 定义文本的显式写法
Object.() -> ReturnType // 拥有接收者的类型签名
匿名函数扩展
val sum = fun Int.(other: Int): Int = this + other
val sum: Int.(Int) -> Int = { other -> plus(other) }
fun Int.sum(other: Int): Int = this + other
http://kotlinlang.org/docs/reference/lambdas.html
关于扩展
一般情况下都在top level定义
函数扩展基于声明静态调用,与对象实际实现类无关
同名成员函数优先于扩展函数
对 Any? 类型扩展,可应对任意类型的 null 值情况
属性扩展只能使用getter/setter提供,并且不能使用field(并不真的添加类成员)
显式类型转换
x as String // x转换为String类型,如果x=null则抛出异常
x as? String // x尝试转换为String?,失败则返回null
引用相等
a === b
a !== b
null异常
a?.length()
a.length()
a?.length() ?: -1
a !!.length() // 强制转换为非null类型,a==null时抛出null异常
网友评论