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>()
}