Android-Kotlin-泛型学习

一、为什么用到泛型

        个人理解为增加代码复用性又解耦代码。

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值