面试题答案
一键面试泛型类型约束的作用
在Kotlin中,泛型类型约束用于限制泛型参数可以接受的类型。通过类型约束,可以确保在泛型代码中使用的类型具有特定的属性或行为,从而提高代码的安全性和可维护性。
上界约束
使用:
符号
使用:
符号可以指定泛型类型的上界,表示泛型参数必须是指定类型或其子类型。
fun <T : Number> printDoubleValue(t: T) {
println(t.toDouble())
}
在上述代码中,T
被约束为Number
类型或Number
的子类型,所以可以调用toDouble()
方法。
使用where
关键字
where
关键字用于在泛型声明中对多个泛型参数添加多个约束条件。
fun <T> printIfNotNull(t: T?) where T : CharSequence, T : Comparable<T> {
if (t != null) {
println(t.length)
println(t.compareTo(""))
}
}
这里T
必须同时满足是CharSequence
类型和Comparable<T>
类型。
下界约束
使用in
关键字指定泛型类型的下界,表示泛型参数必须是指定类型或其超类型。
fun <T : Number> addNumbers(numbers: List<T>) {
var sum = 0.0
for (number in numbers) {
sum += number.toDouble()
}
println(sum)
}
fun main() {
val intList: List<Int> = listOf(1, 2, 3)
addNumbers(intList)
}
在addNumbers
函数中,List<T>
的T
是Number
的子类型,通过in
关键字,可以接受Number
的超类型列表,如List<Int>
,因为Int
是Number
的子类型。
实际开发场景中的应用
- 集合操作:在处理集合时,通过类型约束可以确保集合中的元素具有特定的行为,例如排序、比较等。如上述
addNumbers
函数,确保集合中的元素可以转换为Double
类型进行求和。 - 依赖注入:在依赖注入框架中,通过类型约束可以确保注入的依赖对象具有所需的接口或基类,从而保证代码的兼容性和一致性。
- 通用算法实现:当实现通用算法时,通过类型约束可以限制算法适用的类型范围,确保算法在运行时不会因为类型不匹配而出现错误。例如,实现一个排序算法,要求元素必须实现
Comparable
接口。