泛型类、接口、函数都具备了复用性、类型安全以及高效等优点。
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
}
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 //编译不通过
}
我们先来看一个问题场景。首先下面存在父子关系的模型:
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中高级、架构师对你更是如鱼得水,赶快领取吧!