类型擦除

JVM上的泛型一般都是通过 类型擦除 实现的,就是说泛型类型实例的类型参数在运行时是不保存的

创建一个列表 List 并且将一对字符串放置其中,在运行时你只能知道它是一个 list,不能识别列表本打算包含的是那种类型的元素。这些信息被擦除了。擦除是有好处的:因为保存的信息减少,而使得内存更小

Kotlin中不允许使用没有指定 类型实参 的泛型类型。
检查一个值是否是列表,而不是set或者其他,可以使用 星号投影语法 来检查:

  1. if(value is List<*>){}

星号可认为它就是拥有未知类型实参的泛型类型,类似于java中的 List<?>

声明带实例化类型参数的函数

泛型-运行时的泛型 - 图1
内联函数(inline)恰好可以突破此限制:内联函数的类型形参能后被实例化,就是可以在运行时引用实际的类型实参。
泛型-运行时的泛型 - 图2

如果函数用Inline声明,并且用 reified 标记类型参数,则类型参数能被实化并使用
泛型-运行时的泛型 - 图3
举一个标准库的例子:
泛型-运行时的泛型 - 图4

实化类型参数替换类引用

所谓的实化类型参数:加了 reified标记的类型参数
泛型-运行时的泛型 - 图5