kotlin学习(8)泛型

泛型的声明

  与Java不一样的是,Kotlin要求类型实参要么被显示的说明,要么能被编译器推导出来。由于Java在1.5版本才引入泛型,因此为了兼容过去的版本,能够不直接声明List类型的变量,而不说明类型。ide

//下面两种是等价的
val readers = arrayListOf<String>()
val readers:ArrayList<String>=arrayListOf()

泛型函数

//  第一处是类型形参声明,第二三处分别是接收者和返回类型使用了类型形参
fun <T> List<T>.slice(indices: IntRange): List<T>{
    val res=arrayListOf<T>()
    indices.forEach{
        res.add(this[it])
    }
    return res
}

//调用
>>>val letters=('a'..'z').toList()
>>>println(letters.slice<Char>(0..2)) //这里显式的指定类型实参
[a,b,c]

>>>println(letters.slice(1..2)) //这里能够根据letters推导出类型为Char
[a,b,c]

  泛型属性同理函数

泛型类

//List接口定义了类型参数T
interface List<T>{   
    //在类或接口的内部,T能够看成普通类型使用
    operator fun get(index: Int): T    
}

//这个类实现了List,提供了具体类型实参String
class StringList: List<String>{
    override get(index: Int): String {   //xxxxx   }    
}    

//如今ArrayList的泛型类型形参T就是List的类型实参
class ArrayList<T>: List<T>{
    override get(index: Int): T {   //xxxxx   }
}

类型参数约束

  “ <T extends Number> ”表明类型形参必定属于Number类型,限制了它的上界。this

让类型形参非空

  " <T : Any> " 表明T的类型必定是非空的,它不接受传入<String?>这样的可空实参。spa

不能指定具体类型实参的状况下能够用*

   if ( value is List<*> ){ ... } 这样之判断了value是否为List,而不用在乎类型实参具体是什么。code

相关文章
相关标签/搜索