一、为什么用到泛型
个人理解为增加代码复用性又解耦代码。
在Java中,我们常见的泛型有:泛型类、泛型接口、泛型方法和泛型属性,Kotlin泛型系统继承了Java泛型系统,同时添加了一些强化的地方(摘自Imooc的视频:https://www.imooc.com/video/23361)。
1、泛型接口/类(泛型类型)
定义泛型类型,实在类型名之后、主构造函数之前用尖括号括起来的大写字母类型参数指定:
/**
* 备注:kotlin泛型
*/
fun main() {
//泛型接口
val drinkApple = DrinkApple()
drinkApple.drink("drink")
//2、泛型类
val blueColor1 = BlueColor1("#0000ff")
blueColor1.printColor()
val blueColor2 = BlueColor2()
blueColor2.printColor("#0000ff")
//3、泛型方法
fromJson1<String>("",String::class.java)
fromJson1<DrinkApple>("",DrinkApple::class.java)
//4、泛型约束,也可以是View的子类
fromJson2<View>("",View::class.java)
fromJson2<TextView>("",TextView::class.java)
//5、泛型约束2
fromJson3<ViewTest>("",ViewTest::class.java)
}
interface Drink<T>{
fun drink(t:T/*泛型字段*/)
}
class DrinkApple:Drink<String>{
override fun drink(t: String) {
println("drink:${t}")
}
}
abstract class Color1<T>(val t:T/*泛型字段*/){
abstract fun printColor()
}
class BlueColor1(val color:String):Color1<String>(color){
override fun printColor() {
println("printColor1:${color}")
}
}
abstract class Color2<T>{
abstract fun printColor(t:T/*泛型字段*/)
}
class BlueColor2: Color2<String>() {
override fun printColor(color:String) {
println("printColor2:${color}")
}
}
//泛型方法
fun<T> fromJson1(json:String,tClass:Class<T>):T?{
val instance:T? = tClass.newInstance()
return instance
}
//泛型约束1
//泛型T只能是AD_data或AD_data的子类
fun<T:View> fromJson2(json:String,tClass:Class<T>):T?{
val instance:T? = tClass.newInstance()
return instance
}
//泛型约束2
fun <T> fromJson3(json:String,tClass:Class<T>):T? where T:Comparable<T> {
val instance:T? = tClass.newInstance()
return instance
}
class ViewTest:JSONObject(),Comparable<ViewTest>{
override fun compareTo(other: ViewTest): Int {
return 0
}
}
//out约束泛型参数的类型上限
open class Animal
class DogAnimal:Animal()
class CatAnimal:Animal()
class WhiteDogAnimal:Animal()
fun animalFuns(){
//传入的泛型参数可以是Animal及Animal的子类
val animalList:ArrayList<out Animal> = ArrayList<DogAnimal>()
//使用处使用in关键字声明,约定泛型的下限,允许传入的泛型类型是DogAnimal及父类Animal
val animalList2:ArrayList<in DogAnimal> = ArrayList<Animal>()
}