当前位置:嗨网首页>书籍在线阅读

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