六、Kotlin——Kotlin泛型

45 阅读2分钟

Kotlin 的泛型与 Java 一样,都是一种语法糖。泛型(Generics)其实就是把类型参数化,它的引入给强类型编程语言加入了更强的灵活性。

在 Java 中,我们常见的泛型有:泛型类、泛型接口、泛型方法和泛型属性,Kotlin 泛型系统继承了 Java 泛型系统,同时添加了一些强化的地方。

1、泛型接口/类(泛型类型)

  • 泛型接口
/// 泛型接口
interface Drinks<T>{
    fun priceDrink(t: T)
}

class DrinkApple: Drinks<String>{
    override fun priceDrink(t: String) {
        
    }
}
fun main() {
    val  apple = DrinkApple()
    apple.priceDrink("苹果")
}
  • 泛型类
abstract class Color<T>(val t: T){
    abstract fun  printColor()
}
class BlueColor(color: String): Color<String>(color){
    override fun printColor() {
        println("color=")
    }
}

fun main() {
    val  blue = BlueColor(color = "blue")
    blue.printColor()
}

2、泛型字段

定义泛型类型字段,可以完整地写明类型参数,如果编译器可以自动推定类型参数,也可以省略类型参数:

abstract class Color<T>(val t:T/*泛型字段*/){ 
  abstract fun printcolor()
}

3、泛型方法

类型参数要放在方法名的前面

fun  <T> fromJson(json: String, tClass : Class<T>) : T?{
    val  t: T? = tClass.newInstance()
    return  t
}

4、泛型约束

限定泛型参数的类型

//所传递的类型T必须满足是JSONObject的子类 或JSONObject类
fun  <T: JSONObject> fromJson(json: String, tClass : Class<T>) : T?{
    val  t: T? = tClass.newInstance()
    return  t
}
// 泛型类型限定-2
// 所传递的类型T必须同时满足 where 子句的所有条件
//在下面的示例中,类型T必须既实现了 User,也实现了 Comparable。
 fun <T> fromjson(json: String, tclass: Class<T>):T? where T : Js0Nobject, T : comparable<T> {
     val instance:T?= tclass.newInstance()
    return instance
}

5、泛型中的out与in

out约束泛型参数的类型上限 泛型参数的类型 允许传入T,以及T的子类

使用处使用in关键字声明,约定泛型的下限

open class  Animal

open class DogAnimal: Animal()

class CatAnimal: Animal()
class  WhiteDogAnimal: DogAnimal()

fun main() {
    val animal: Animal = DogAnimal()
    // 传入的泛型参数可以是 Animal及Animal的子类DogAnimal,CatAnimal,WhiteDogAnimal.…
    var animalList: ArrayList<out Animal> = arrayListOf(DogAnimal())
    
    ```
// 使用处使用in关键字声明,约定泛型的下限
val animalList3: ArrayList<in DogAnimal> = arrayListOf<Animal>()

}