记一次安卓(Kotlin)-kotlin泛型_08

165 阅读2分钟

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> {
    ...
}