泛型
Kotlin 的泛型与 Java 一样,都是一种语法糖,即只在源代码中有泛型定义,到了class级别就被擦除了。 泛型(Generics)其实就是把类型参数化,真正的名字叫做类型参数,它的引入给强类型编程语言加入了更强的灵活性。
泛型的好处
- 增强代码的通用性
- 熟悉泛型有助于理解其他框架源码
- 增加代码的健壮性,避免运行时类型转换异常;
说道泛型,在Java中,通常指的是泛型接口/类、泛型参数、泛型方法和泛型属性,Kotlin的泛型继承了Java的泛型系统,同时有所加强。
几种泛型的表现
泛型类、接口
1 | // 泛型接口 |
1 | class Box<T>(t:T) { |
型变
声明处型变
假设有一个泛型接口 Source<T>
,该接口中不存在任何以 T
作为参数的方法,只是方法返回 T
类型值:
先看看Java这样实现会遇到什么样的问题
1 | interface Source<T> { |
然后
Kotlin采用 in
或out
关键字来表示声明处型变,具体来说
1 |
类型投影
使用处型变:类型投影
星投影
泛型函数
泛型约束
类型擦除
这个类型擦除应该和Java中类似,及泛型声明用法执行的类型安全检测仅在编译器进行