Z
ZHANK
集合与泛型

泛型

泛型类/函数、型变 out/in、where 约束、reified 实化

泛型

Kotlin 泛型支持型变out/in)和实化类型参数reified)。

学完本章你将: 掌握泛型类/函数、out 协变/in 逆变、reified。


泛型类与函数

kotlin
class Box<T>(val item: T)

fun <T> singletonList(item: T): List<T> = listOf(item)

val box = Box(42)             // Box<Int>
val list = singletonList("A") // List<String>

out 协变(生产者)

kotlin
// out = 只能读取(生产者)——子类可替代父类
interface Source<out T> {
    fun next(): T
}

fun demo(src: Source<String>) {
    val ref: Source<Any> = src   // ✅ String 可替代 Any
}

in 逆变(消费者)

kotlin
// in = 只能写入(消费者)——父类可替代子类
interface Sink<in T> {
    fun put(item: T)
}

fun demo(sink: Sink<Any>) {
    val ref: Sink<String> = sink  // ✅ Any 可替代 String
}

where 约束

kotlin
fun <T> copyWhenGreater(list: List<T>, threshold: T): List<T>
    where T : CharSequence,     // 必须同时满足
          T : Comparable<T> {
    return list.filter { it > threshold }
}

reified 实化类型参数

kotlin
// inline + reified = 运行时保留泛型信息
inline fun <reified T> isType(value: Any): Boolean {
    return value is T     // ✅ 普通泛型不能这样用
}

println(isType<String>("Hello"))  // true
println(isType<Int>(42))          // true