Kotlin学习笔记:泛型

Kotlin学习笔记:概述
Kotlin学习笔记:基本语法和函数
Kotlin学习笔记:类和接口
Kotlin学习笔记:lambda编程
Kotlin学习笔记:类型系统
Kotlin学习笔记:泛型
Kotlin学习笔记:注解和反射

Kotlin的泛型创建和Java几乎一样。在运行时,也会进行类型擦除。

类型参数约束

T : Number等价于T extends Number

泛型的定义

image.png

类型参数的约束

T : Number等价于T extends Number

image.png

reified类型参数

Kotlin在运行时,也会进行类型擦除。但是如果想要在运行时获取正确的类型参数类型,可以使用refied关键字。reified只能用于inline函数。

inline fun <reified T> isA(value: Any) = value is T
>>> println(isA<String>("abc"))
true
>>> println(isA<String>(123))
false

Collection的filterIsInstance方法就是使用refied,可以从集合中选择指定类型的实例。

inline fun <reified T> Iterable<*>.filterIsInstance(): List<T>{ 
    val destination = mutableListOf<T>()
    for (element in this) {
        if (element is T){ 
            destination.add(element)
        }
    }
    return destination
}

实现原理

编译器把内联函数的字节码插入到每一次被调用的地方

每次调用reified函数时,编译器知道类型参数的确切类型、

编译器可以生产引用作为类型实参的具体类字节码

生成的字节码引用了具体类,而不是类型参数

refied函数不能被Java调用

应用场景

inline fun <reified T: Activity> Context.startActivity(){
    val intent = Intent(this, T::class.java)
    startActivity(intent)
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 基本用法 2. 型变 型变包括 协变、逆变、不变 三种: 协变:泛型类型与实参的继承关系相同 逆变:泛型类型...
    全栈Evan阅读 3,064评论 0 1
  • 第8章 泛型 通常情况的类和函数,我们只需要使用具体的类型即可:要么是基本类型,要么是自定义的类。但是在集合类的场...
    光剑书架上的书阅读 6,375评论 6 10
  • fun <T> List<T>.slice(indices: IntRange): List<T><T>: 类型...
    笔云客阅读 3,994评论 0 0
  • 考虑到各位亲们工作比较辛苦,而目前各内容平台又充斥着大量无聊的文章,小编决定将寻找并珍藏了好多年最爱的歌曲分享给大...
    价值园阅读 5,312评论 0 51
  • 家所在的小城是很小的,比如我家到城里最繁华的超市只隔了一座桥的距离,再远就是我读的城里的中学,不过两公里路,自行车...
    冷魄阅读 3,255评论 0 0