泛型,即 “参数化类型”,将类型参数化,可以用在类、接口、方法上。
与Java语言中的非常相似,但是Kotlin语言的创建者试图通过引入特殊的关键字(如out和in)来使它们更加直观和易于理解。
以下是使用泛型的主要优点:
- 类型安全:通用允许仅保留单一类型的对象。泛型不允许存储其他对象。
- 不需要类型转换:不需要对对象进行类型转换。
- 编译时间检查:在编译时检查泛型代码,以便在运行时避免任何问题
泛型类
像 java 一样,Kotlin 中的类可以拥有类型参数:
class Box<T>(t: T){
var value = t
}
通常来说,创建一个这样类的实例,我们需要提供类型参数:
val box: Box<Int> = Box<Int>(1)
但如果类型有可能是推断的,比如来自构造函数的参数或者通过其它的一些方式,一个可以忽略类型的参数:
val box = Box(1) //1是 Int 型,因此编译器会推导出我们调用的是 Box<Int>
泛型接口
声明泛型接口的格式与声明泛型类相似,定义如下泛型接口。
interface GenericsInterface<T> {
public T generate();
}
在实现泛型接口的类中,指定泛型实参。
class GenericsClass implements GenericsInterface<String> {
public String generate() {
return "hello";
}
}
泛型函数
范型函数
函数也可以像类一样有类型参数。类型参数在函数名之前:
fun <T> singletonList(item: T): List<T> {
// ...
}
fun <T> T.basicToString