Kotlin的泛型与Java一样,都是一种语法糖.泛型其实就是把类型参数话,它的引入给强类型编程语言加入了更强的灵活性.Kotlin中的泛型:
- 泛型接口/类(泛型类型)
- 泛型字段
- 泛型方法
- 泛型约束
- 泛型中的out与in
泛型接口/类(泛型类型)/泛型字段
//泛型接口
interface Drinks<T> {
fun taste(): T
fun price(t: T)
}
//泛型类
//abstract是抽象类的关键字,用这个关键字修饰的类,类里面定义的方法可以不去实现
abstract class Color<T>(val t:T) {
abstract fun printColor()
}
class BlueColor(val color: String): Color<String>(color) {
override fun printColor() {
println("printColor: ${color}")
}
}
//用法
val blueColor = BlueColor("blue")
blueeColor.printColor()
泛型方法
类型参数要放在方法名的前面
fun <T> fromJson(json: String, tClass: Class<T> T?) {
val t: T? = tClass.newInstance()
return t
}
//主意使用传入的tClass如果是String应该这么写
fromJson("{}", String::class.java)
主意参数类型的时候这么写,以String举例,String::class.java
泛型约束
限定泛型参数的类型
//泛型类型限定-1
//所传递的泛型类型T必须满足是User的子类或User类
fun <T: User> fromJson(json: String, tClass: Class<T>): T? {
...
}
//泛型类型限定-2
//所传递的类型T必须同时满足where子句的所有条件,在下面的示例中,类型T必须既实现了User,也实现了Comparable接口
fun <T> fromJson(json: String, tClass: Class<T>): T? where T: User, T: Comparable<T> {
...
}
out约束泛型参数的类型上限
泛型参数的类型,允许传入T,以及T的子类
//传入的泛型参数可以是Number以及Number的子类Int,Double,Float...
//1.使用处使用out关键字声明--泛型上限
val animalList: ArrayList<out Animal> = DogAnimal()
在定义处/使用处使用out关键字声明,允许传入的泛型参数可以是T以及T的子类
in约束泛型参数的类型下限
泛型类型限定为T及T的父类
//在使用处使用in
val animalList: ArrayList<in DogAnimal> = InArrayList<Animal>()
//在声明处使用in
class ArrayList<in T> {
...
}