一.泛型
在使用java的泛型時候,下面的程式碼無法通過編譯的。因為為了泛型的型別安全,Java 中的泛型型別是 不可變的(invariant), 也就是說 Box 不是 Box 的子型別
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)) |