Kotlin學習筆記 其他

月光邊境發表於2018-01-18

一.泛型

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

interface Box<T> {
}

void foo(Box<String> strs) {
     //錯誤
    Box<Object> objects = strs;
}
複製程式碼

在Kotlin中的泛型中,我們可以使用兩個註解 outin來解決上面的問題 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))

相關文章