美文网首页
Kotlin学习笔记-其他

Kotlin学习笔记-其他

作者: Wang_Yi | 来源:发表于2017-06-08 11:02 被阅读26次

    一.泛型

    在使用java的泛型时候,下面的代码无法通过编译的。因为为了泛型的类型安全,Java 中的泛型类型是 不可变的(invariant), 也就是说 Box<String> 不是 Box<Object> 的子类型

    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))|

    相关文章

      网友评论

          本文标题:Kotlin学习笔记-其他

          本文链接:https://www.haomeiwen.com/subject/fjaofxtx.html