泛型约束
限定类型参数
泛型约束 是 CoddyKit 上的免费 Kotlin Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kotlin Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kotlin Academy 课程共包含 4 节课。
限制类型参数
有时泛型只能接受某些类型,例如可比较的类型或继承某个基类的类型。泛型约束会为类型参数设置上界。
默认上界
没有约束时,类型参数的上界是 Any?,因此它接受包括可空类型在内的任何类型。若只允许非空类型,请将其约束为 Any。
fun <T : Any> requireNonNull(value: T): T {
return value
}
fun main() {
println(requireNonNull(42))
}单个上界
使用 T : Bound 要求 T 是 Bound 的子类型。这样,您就可以在函数内部调用该上界的成员。
fun <T : Number> sumDoubled(a: T, b: T): Double {
return a.toDouble() * 2 + b.toDouble() * 2
}
fun main() {
println(sumDoubled(3, 4))
println(sumDoubled(1.5, 2.5))
}Comparable 上界
一种常见的上界是 Comparable<T>,它允许您使用 <、> 或 compareTo 比较元素。
fun <T : Comparable<T>> maxOf2(a: T, b: T): T {
return if (a > b) a else b
}
fun main() {
println(maxOf2(3, 9))
println(maxOf2("apple", "banana"))
}调用上界成员
在受约束的泛型内部,编译器知道 T 具有该上界提供的接口,因此您可以直接调用这些方法,而无需进行类型转换。
fun <T : CharSequence> describe(value: T): String {
return "Length is ${value.length}"
}
fun main() {
println(describe("hello"))
println(describe(StringBuilder("hi")))
}使用 where 指定多个上界
如果需要指定多个上界,请使用 where 子句。此时,T 必须满足列出的 ALL 个约束。
fun <T> copyWhenValid(value: T): T
where T : CharSequence, T : Comparable<T> {
return value
}
fun main() {
println(copyWhenValid("text"))
}类的上界
泛型类同样可以使用约束,从而限制实例化该类时允许使用的类型。
class NumberBox<T : Number>(val value: T) {
fun asDouble(): Double = value.toDouble()
}
fun main() {
val box = NumberBox(10)
println(box.asDouble())
}约束启用操作
约束的意义就在于解锁操作。如果没有 T : Number,您就无法调用 toDouble();该上界保证了这个方法的存在。
实际使用非空上界
将类型约束为 Any 会在编译时拒绝可空参数,这是要求泛型非空的一种实用方式。
fun <T : Any> firstNonNull(a: T, b: T): T = a
fun main() {
println(firstNonNull("x", "y"))
// firstNonNull(null, "y") would not compile
}与型变结合使用
约束和型变解决的是不同问题:型变(in/out)控制子类型关系,而约束(: 上界、where)限制允许使用哪些类型。二者可以结合使用。
设计良好的约束
只有在需要使用类型提供的某项能力时才添加约束。过度约束会降低可复用性,约束不足则会迫使您进行类型转换。请约束到能够提供所用操作的最通用类型。
快速检查
如何要求类型参数满足多个上界?
回顾
泛型约束使用 T : Bound(多个上界时使用 where)设置上界,从而启用上界提供的操作并排除不兼容的类型。将上界设为 Any 可以要求类型非空。结合型变后,约束能帮助您设计出安全且表达力强的泛型。至此,泛型与型变课程全部完成。
常见问题解答
「泛型约束」课时是免费的吗?
是的 — 「泛型约束」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kotlin Academy 课程的其余内容,请升级到 CoddyKit PRO。 Kotlin Academy 课程共包含 4 节课。
「泛型约束」这节课中我会学到什么?
限定类型参数 你通过在浏览器中直接运行的动手代码来练习 Kotlin Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Kotlin Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Kotlin Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「泛型约束」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Kotlin Academy 课中编写并运行代码吗?
能。每节 Kotlin Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。