7
Kotlin 允许使用对应名称的函数来重载一些标准的数学运算,但是不能定义自己的运算符。
比较运算符映射为equals 和compare To 方法的调用。
通过定义名为get 、set 和contains 的函数,就可以让你自己的类与Kotlin 的集合一样,使用[]和in 运算符。
可以通过约定来创建区间,以及迭代集合和数组。
解构声明可以展开单个对象用来初始化多个变量,这可以方便地用来从函数返回多个值。它们可以自动处理数据类,可以通过给自己的类定义名为componentN 的函数来支持。
委托属性可以用来重用逻辑,这些逻辑控制如何存储、初始化、访问和修改属性值,这是用来构建框架的一个强大的工具。
lazy 标准库函数提供了一种实现惰性初始化属性的简单方法。
Delegates.observable 函数可以用来添加属性更改的观察者。
委托属性可以使用任意m ap 来作为属性委托,来灵活来处理具有可变属性集的对象。
8
函数类型可以让你声明一个持有函数引用的变量、参数或者函数返回值。
高阶函数以其他函数作为参数或者返回值。可以用函数类型作为函数参数或者返回值的类型来创建这样的函数。
内联函数被编译以后,它的字节码连同传递给它的lambda 的字节码会被插入到调用函数的代码中,这使得函数调用相比于直接编写相同的代码,不会产生额外的运行时开销。
高阶函数促进了一个组件内的不同部分的代码重用,也可以让你构建功能强大的通用库。
内联函数可以让你使用非局部返回一一在lambda 中从包含函数返回的返回表达式。
匿名函数给lambda 表达式提供了另一种可选的语法,用不同的规则来解析return 表达式。可以在需要编写有多个退出点的代码块的时候使用它们。
9
Kotlin 的泛型和Java 相当接近:它们使用同样的方式声明泛型函数和泛型类。
和Java 一样,泛型类型的类型实参只在编译期存在。
不能把带类型实参的类型和is 运算符一起使用,因为类型实参在运行时将被擦除。
内联函数的类型参数可以标记成实化的,允许你在运行时对它们使用is 检查,以及获得java.lang.Class 实例。
变型是一种说明两种拥有相同基础类型和不同类型参数的泛型类型之间子类型化关系的方式,它说明了如果其中一个泛型类型的类型参数是另一个的类型参数的子类型, 这个泛型类型就是另外一个泛型类型的子类型或者超类型。
可以声明一个类在某个类型参数上是协变的,如果该参数只是用在out 位置。
逆变的情况正好相反:可以声明一个类在某个类型参数上是逆变的,如果该参数只是用在in 位置。
Kotlin 中的只读接口List 声明成了协变的,这意味着List<String >是List <Any > 的子类型。
函数接口声明成了在第一个类型参数上逆变而在第二个类型参数上协变,使(Animal)- >Int 成为( Cat )一> Number 的子类型。
在Kotlin 中既可以为整个泛型类指定变型(声明点变型) ,也可以为泛型类型特定的使用指定变型(使用点变型)。
当确切的类型实参是未知的或者不重要的时候,可以使用星号投影语法。
10
Kotlin 中应用注解的语法和Java 几乎一模一样。
在Ko ti in 中可以让你应用注解的目标的范围比Java 更广,其中包括了文件和表达式。
一个注解的参数可以是一个基本数据类型、一个字符串、一个枚举、一个类引用、一个其他注解类的实例,或者前面这些元素组成的数组。
如果单个Kotlin 声明产生了多个字节码元素,像@ get : Rule 这样指定一个注解的使用点目标,允许你选择注解如何应用。
注解类的声明是这样的,它是一个拥有主构造方法且没有类主体的类,其构造方法中所有参数都被标记成val 属性。
元注解可以用来指定(使用点)目标、保留期模式和其他注解的特性。
反射API 让你在运行时动态地列举和访问一个对象的方法和属性。它拥有许多接口来表示不同种类的声明,例如类( KClass )、函数( KFunctio 川等。
要获取一个KClass 的实例,如果类是静态己知的,可以使用
ClassName::class :否则,使用obj.javaClass . kotlin 从对象实例
上取得类。
KFunction 接口和KProperty 接口都继承了KCallable ,它提供了一个通用的call 方法。
KCallable. callBy方法能用来调用带默认参数值的方法。
KFunction0 、KFunctionl1等这种不同参数数量的函数可以使用invoke方法调用。
KProperty0 和KProperty1是接收者数量不同的属性,支持用get 方法取回值。KMutablePropertyO 和KMutablePropertyl 继承了这些接口,支持通过set 方法来改变属性的值。
11
内部DSL 是一种API 设计模式,借助由多个方法调用组成的结构,可以使用这种模式来构建更表意的A PI 。
带接收者的lambda 采用嵌套结构,来重新定义在lambda 函数体中方法应该如何解析。
用作(调用函数)参数的带接收者的lambda ,其类型是扩展函数类型, 井且这个调用函数在调用lambd a 时会为它提供一个接收者实例。
使用Kotlin 内部DSL 而不是外部模板或标记语言的好处是可以重用代码井创建抽象。
使用特殊命名的对象作为中缀调用的参数,允许你创建读起来就像英语的DSL ,而且不带额外的标点符号。
在基本数据类型上定义扩展让你能够为各种字面值(比如日期)创建可读的语法。
使用invoke 约定,可以把任意对象当成函数一样调用。
kotlin . html 库提供了用来构建HTML 页面的内部DSL , 并且很容易扩展,用来支持各种前端开发框架。
kotlintest 库提供的内部DSL , 支持在单元测试中使用可读断言语句。
Exposed 库提供了使用数据库的内部DSL 。
Anko 库为Android 开发提供了各种工具,包括用来定义山布局的内部DSL 。