一.泛型
在使用java的泛型时候,下面的代码无法通过编译的。因为为了泛型的类型安全,Java 中的泛型类型是 不可变的(invariant), 也就是说 Box<String> 不是 Box<Object> 的子类型
interface Box<T> {
}
void foo(Box<String> strs) {
//错误
Box<Object> objects = strs;
}
在Kotlin中的泛型中,我们可以使用两个注解 out 和 in来解决上面的问题
out
interface Box<out T> {
}
fun foo(strs: Box<String>) {
//合法
val objects: Box<Any> = strs
}
in
interface Box<in T> {
}
fun foo(strs: Box<Any>) {
//合法
val objects: Box<String> = strs
}
二.解构
Kotlin中我们可以把一个对象结构成多个变量
data class Person(val name: String, val age: Int, val gender: Int)
val p = Person("Jerry", 12, 0)
val (name, age, gender) = p
需要注意的是:如果Person不是一个data类,那么我们需要自己在Person中实现component函数
class Person(val name: String, val age: Int, val gender: Int) {
operator fun component1(): Any {
return name
}
operator fun component2(): Any {
return age
}
operator fun component3(): Any {
return gender
}
}
三.操作符重载
Kotlin预定义了一些操作符,我们可以通过实现对应的函数来对这些操作符重载
举个栗子:重载 a+b操作符
class Foo(val id: Long) {
operator fun plus(that: Foo): Long {
return this.id + that.id
}
}
fun main(args: Array<String>) {
val a = Foo(100)
val b = Foo(101)
println(a + b)//201
}
下面是Kotlin中操作符重载的约定
一元操作符
|Expression|Translated to|
| ------ |:------:| -----:|
| +a | a.unaryPlus() |
| -a | a.unaryMinus() |
| !a | a.not() |
| a++ | a.inc() |
| a-- | a.dec() |
二元操作符
|Expression|Translated to|
| ------ |:------:| -----:|
|a + b|a.plus(b)|
|a - b|a.minus(b)|
|a * b|a.times(b)|
|a / b|a.div(b)|
|a % b|a.mod(b)|
|a..b|a.rangeTo(b)|
|a in b|b.contains(a)|
|a !in b|!b.contains(a)|
|a += b|a.plusAssign(b)|
|a -= b|a.minusAssign(b)|
|a *= b|a.timesAssign(b)|
|a /= b|a.divAssign(b)|
|a %= b|a.modAssign(b)|
数组类型操作符
|Expression|Translated to|
| ------ |:------:| -----:|
|a[i]|a.get(i)|
|a[i, j]|a.get(i, j)|
|a[i_1, ..., i_n]|a.get(i_1, ..., i_n)|
|a[i] = b|a.set(i, b)|
|a[i, j] = b|a.set(i, j, b)|
|a[i_1, ..., i_n] = b|a.set(i_1, ..., i_n, b)|
invoke操作
|Expression|Translated to|
| ------ |:------:| -----:|
|a()|a.invoke()|
|a(i)|a.invoke(i)|
|a(i, j)|a.invoke(i, j)|
|a(i_1, ..., i_n)|a.invoke(i_1, ..., i_n)|
等式操作
|Expression|Translated to|
| ------ |:------:| -----:|
|a == b|a?.equals(b) ?: (b === null)|
|a != b|!(a?.equals(b) ?: (b === null))|
网友评论