Kotlin学习(8)泛型,90%的人看完都说好

本文详细介绍了Kotlin中的泛型,包括在类、接口和函数上的使用,以及类型上界、协变与逆变的概念。通过实例展示了泛型在实际开发中的应用,帮助读者更好地理解和运用泛型提高代码的复用性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 在类、接口和函数上使用泛型


泛型类、接口、函数都具备了复用性、类型安全以及高效等优点。

1.1 泛型接口

下面举一个例子:

interface Generator { //类型参数放在接口名称后面

operator fun next(): T //接口函数中直接使用类型T

}

//测试代码:

fun testGenerator() {

val gen = object : Generator { //对象表达式

override fun next(): Int {

return Random().nextInt()

}

}

println(gen.next())

}

上面使用到了 对象表达式。我们 使用 object关键字来声明一个 Generator实现类,并在Lambda表达式中实现了next()函数。

Map中的Key和Value的类型也是泛型,熟悉Java的话应该很容易就知道了。

例如使用mutableMapOf()函数来实例化一个可变Map:

val map = mutableMapOf<Int, String>(1 to “a”, 2 to “b”, 3 to “c”)

map

{1=a, 2=b, 3=c}

map.add(“5”, “e”)

报错

//因为Kotlin中有类型推断的功能,有些类型参数可以直接不写,所以mutableMapOf后面的参数类型可以不写

val map = mutableMapOf(1 to “a”, 2 to “b”, 3 to “c”)

1.2 泛型类

我们直接声明一个带参数类型的Container类,代码如下:

class Container<K, V>(var key: K, var value: V)

测试代码如下:

//<K, V>被具体化为<Int, String>

val container = Container<Int, String>(1, “A”)

println(container) //输出: container = Container(key = 1, value = A)

1.3 泛型函数

在泛型接口和泛型类中,我们都在类名和接口名后声明了泛型参数。

而实际上也可以直接在类或接口中的函数中声明泛型参数或者在包级函数中直接声明泛型参数。

就是在方法名前面加一个<T>,参数中带个<T>

class GenericClass{

fun console(t: T) { //类中的泛型函数

println(t)

}

}

interface GenericInterface {

fun console(t: T) //接口中的泛型函数

}

fun <T : Comparable> gt(x: T, y: T): Boolean{ //包中的泛型函数

return x > y

}

2. 类型上界


fun <T : Comparable> gt(x: T, y: T): Boolean //T的类型上界是Comparable

这里的T:Comparable,表示Comparable是类型T的上界。

也就是告诉编译器,类型参数T代表的都是实现了Comparable的接口的类。

在Java中就是 <T extend Comparable>

如果没有声明上界的话,就必须保证 函数中使用的操作符是可以用的:

fun gt(x: T, y:T): Boolean{

return x > y //编译不通过

}

3. 协变与逆变


我们先来看一个问题场景。首先下面存在父子关系的模型:

open class Food

open class Fruit : Food() //Fruit继承Food

class Apple : Fruit() //Apple继承Fruit

class Banana : Fruit() //Banana继承Fruit

class Grape : Fruit() //Grape继承Fruit

//两个函数

object GenericTypeDemo {

fun addFruit(fruit: MutableList){}

fun getFruit(fruit: MutableList<Fruit){}

}

这个时候可以这样调用上面的两个函数:

总结

Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

上面分享的字节跳动公司2021年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

Android学习PDF+学习视频+面试文档+知识点笔记

【Android高级架构视频学习资源】

Android学习PDF+学习视频+面试文档+知识点笔记

【Android高级架构视频学习资源】

Android部分精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值