Kotlin泛型:类型参数的具体化与方差
1. 类型参数的具体化
在Kotlin中,类型参数的具体化是一个强大的特性。编译器会内联 isInstanceOf() 函数,将实际类型替换类型参数 T 。例如以下代码:
println(tree.isInstanceOf<String>())
编译器执行的代码会是这样:
fun main() {
val tree = TreeNode<Any>("abc").addChild("def").addChild(123)
println(tree.cancellableWalkDepthFirst { it is String })
}
与Java的方法不同,具体化类型参数提供了安全(无未检查的强制类型转换)和快速(由于内联)的解决方案。不过,使用内联函数往往会增加编译后代码的大小,但可以通过将大量代码提取到单独的非内联函数中来缓解这个问题。而且,由于具体化类型参数仅支持内联函数,因此不能在类或属性中使用它们。
具体化类型参数也有其局限性,与完整类型有所区别。具体来说,目前无法通过具体化类型参数调用构造函数或访问伴生成员,例如:
inline fun <reified T> factory() = T() // Error
超级会员免费看
订阅专栏 解锁全文
58

被折叠的 条评论
为什么被折叠?



