06-泛型基础
8.2.1 泛型基础
在Java中,只要是有明确类型的API都可以泛型化,其中比较重要的是泛型类型和泛型方法,Kotlin 泛型系统继承自Java,同时对Java的泛型进行了一定的优化处理。
Kotlin的泛型定义和使用方法与Java大体相同,泛型可以用在类、接口和方法上。定义泛型类型时,通过尖括号包含大写字母的方式来表示,具体的格式如下。
//定义泛型类
class Box<T>{ … }
//定义泛型接口
interface Box<T>{ … }
//定义泛型方法,<T>用于声明泛型
<T> T read(T t){ … }
为了方便理解,我们来看一个具体的泛型定义实例。
class Box<T>(val value: T)
// 以下都是合法的语句
val box1: Box<Int> = Box<Int>(1)
val box2: Box<Int> = Box(1)
val box3 = Box(1)
使用泛型类时,如果类型参数可以推断出来,则可以省略泛型参数。Kotlin的泛型函数声明与Java相同,类型参数要放在函数名前面。代码如下。
class Box<T>(val value: T)
fun <T> boxIn(value: T) = Box(value)
fun main(args: Array<String>) {
// 以下语句都是合法的
val box4 = boxIn<Int>(1)
val box5 = boxIn(1)
}
在使用泛型函数时,可以在类型参数里使用冒号来指定上界。代码如下。
fun <T : Comparable<T>> sort(list: List<T>) { … }
对于多个上界约束条件,还可以使用where子句。代码如下。
fun <T> clone(list: List<T>, threshold: T): List<T>
where T : Comparable, Cloneable {
return list.filter(it > threshold).map(it.clone())
}