Kotlin——泛型

泛型

Kotlin 的泛型与 Java 一样,都是一种语法糖,即只在源代码中有泛型定义,到了class级别就被擦除了。 泛型(Generics)其实就是把类型参数化,真正的名字叫做类型参数,它的引入给强类型编程语言加入了更强的灵活性。

泛型的好处

  1. 增强代码的通用性
  2. 熟悉泛型有助于理解其他框架源码
  3. 增加代码的健壮性,避免运行时类型转换异常;

说道泛型,在Java中,通常指的是泛型接口/类、泛型参数、泛型方法和泛型属性,Kotlin的泛型继承了Java的泛型系统,同时有所加强。

几种泛型的表现

泛型类、接口

1
2
3
// 泛型接口

//
1
2
3
4
5
6
7
class Box<T>(t:T) {
var value = t
}

var box : Box<Int> = Box<Int>(1)
// 等价于
var box = Box(1)// 因为类型参数可以直接推断出来

型变

声明处型变

假设有一个泛型接口 Source<T>,该接口中不存在任何以 T 作为参数的方法,只是方法返回 T 类型值:

先看看Java这样实现会遇到什么样的问题

1
2
3
interface Source<T> {
T nextT();
}

然后

Kotlin采用 inout关键字来表示声明处型变,具体来说

1

类型投影

使用处型变:类型投影

星投影

泛型函数

泛型约束

类型擦除

这个类型擦除应该和Java中类似,及泛型声明用法执行的类型安全检测仅在编译器进行