Kotlin 幻影类型参数与具体化泛型的深度陷阱
揭示 reified 关键字背后编译器生成的桥接代码,以及幻影类型参数在 DSL 设计中的创新应用。 · 难度:入门 · +10XP
幻影类型参数与具体化泛型的深度陷阱
reified 关键字让泛型在运行时得以保留,但它的实现并非魔法——编译器通过内联函数在调用处直接替换类型信息。本教程将拆解 reified 生成的字节码,展示它如何利用 inline 机制绕过 JVM 的类型擦除。同时引入‘幻影类型参数’概念:一个类型参数在运行时没有对应值,仅用于在编译期标记类型状态。我们将用它构建一个类型安全的构建器,防止在运行时传递错误类型的对象。
inline fun <reified T> List<*>.filterIsInstance(): List<T> {
return this.filter { it is T }.map { it as T }
}
// 幻影类型参数示例
class Tagged<T>(private val value: Any) {
@Suppress("UNCHECKED_CAST")
fun get(): T = value as T
}
fun main() {
val intTag: Tagged<Int> = Tagged(42)
val strTag: Tagged<String> = intTag // 编译错误!类型不匹配
}