美文网首页
Kotlin实战学习笔记(九 泛型)

Kotlin实战学习笔记(九 泛型)

作者: Pyrrha_89c6 | 来源:发表于2017-12-10 19:20 被阅读0次
    1. 泛型类型参数
    • 类型参数要么被显示的声明出来,要么可以推导(和Java不同)
    • 函数声明
      fun <T> List<T>.slice(indices: IntRange): List<T>
    • 扩展属性
    val <T> List<T>.penultimate: T 
        get() = this.[size - 2]
    
    • 声明泛型类
    class StringList: List<String> { //确定了类型都是String
       override fun get(i: Int) : String {...}
    }
    class ArrayList<T>: List<T>{
        override fun get(i: Int) : T {...}
    }
    
    • 上界约束
    <T extend Type>  //java
    <T: Type> // kotlin
    //kotlin特有的多个上界约束
    fun <T>  foo(p: T) where T: Type1,T: Type2{ ... } //T必须是Type1和Type2的子类或实现类
    <T>  == <Any?> //所以类型可为null
    <T:Any> // 这样就不能为null了
    
    1. 运行时类型擦除
    • 和Java一样List<T> 会被擦除为List
    value is List<String>  // error,现在的value是List
    value is List<*> // pass
    
    • 用inline函数实现对泛型的检查
    inline fun <reified T> isA (value: Any) = value is T
    // Kotlin 自带函数
    list.filterIsInstance<T>() // 过虑为T类型的数据
    
    • 带reified的inline函数不能在Java中调用
    1. 变型
      见P250
      kt: <out T> ~= java :<? extends T> //只做生成类型,kotlin叫协变
      kt: <in T> ~= java :<? super T> //只做消费类型,kotlin叫逆变
    • 点变 P254
      书上大概说的是: <out T>可读不可变可作为方法的返回值<in T>可变不读可作为方法是参数
    • <*> == <?>

    相关文章

      网友评论

          本文标题:Kotlin实战学习笔记(九 泛型)

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