泛型的声明
与Java不同的是,Kotlin要求类型实参要么被显示的说明,要么能被编译器推导出来。因为Java在1.5版本才引入泛型,所以为了兼容过去的版本,可以不直接声明List类型的变量,而不说明类型。
//下面两种是等价的 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类型,限制了它的上界。
让类型形参非空
" <T : Any> " 代表T的类型一定是非空的,它不接受传入<String?>这样的可空实参。
不能指定具体类型实参的情况下可以用*
if ( value is List<*> ){ ... } 这样之判断了value是否为List,而不用在意类型实参具体是什么。