仓颉原生应用编程语言教程(第5期)

泛型

视频:KCKCJY

在现代软件开发中,泛型编程已成为提高代码质量、复用性和灵活性的关键技术。泛型作为一种参数化多态技术,允许开发者在定义类型或函数时使用类型作为参数,从而创建可适用于多种数据类型的通用代码结构。泛型带来的好处包括:

代码复用:能够定义可操作多种类型的通用算法和数据结构,减少代码冗余。

类型安全:支持更多的编译时的类型检查,避免了运行时类型错误,增强了程序的稳定性。

性能提升:由于避免了不必要的类型转换,泛型还可以提高程序执行效率。

仓颉支持泛型编程,诸如函数、struct、class、interface、extend 都可以引入泛型变元以实现功能的泛型化。数组类型在仓颉中就是典型的泛型类型应用,其语法表示为 Array ,其中 T 表示了元素的类型,可以被实例化为任何一个具体的类型,例如 Array 或 Array ,甚至可以是嵌套数组 Array<Array >,从而可以轻易地构造各种不同元素类型的数组。
除了类型外,我们还可以定义泛型函数。例如我们可以为使用泛型函数来实现任意两个同类型数组的 concat 操作。如下代码所示,我们定义了一个泛型函数 concat,并且它支持任意两个 Array 类型的数组参数,经过处理后返回了一个拼接后的新数组。这样定义的 concat 函数可以应用在 Array 、Array 、Array<Array > 以及其它任意类型的数组上,实现了功能的通用化。
func concat (lhs: Array , rhs: Array ): Array {
let defaultValue = if (lhs.size > 0) {
lhs0
} else if (rhs.size > 0) {
rhs0
} else {
return \[\]
}
let newArr = Array (lhs.size + rhs.size, item: defaultValue)
// 使用数组切片进行整段拷贝
newArr0..lhs.size = lhs
newArrlhs.size..lhs.size+rhs.size = rhs
return newArr
}
泛型和接口以及子类型结合使用,还可以让我们对泛型中的类型变元给出具体的约束,从而对可以实例化该类型变元的实际类型做出限制。下面的例子中,我们希望在数组arr查找元素element。虽然我们并不关心数组及其元素的具体类型,但元素类型T必须能够支持判等操作,让我们能够比较数组中的元素与给定元素是否相等。因此,在lookup函数中的where子句中,我们要求T <: Equatable ,即类型T必须实现了接口Equatable 。
func lookup (element: T, arr: Array ): Bool where T <: Equatable {
for (e in arr){
if (element == e){
return true
}
}
return false
}
仓颉的泛型类型不支持协变。以数组为例,不同元素类型的数组是完全不相同的类型,它们之间不能互相赋值,哪怕元素类型之间具有父子类型关系也是禁止的。这避免了数组协变导致的类型不安全问题。
如下示例所示,Apple 是 Fruit 的子类,但是变量 a 和变量 b 之间是不能互相赋值的,Array 和 Array 之间没有子类型关系。
open class Fruit {}
class Apple <: Fruit {}

main() {

var a: Array = \[\]
var b: Array = \[\]
a = b // 编译报错
b = a // 编译报错
}

相关推荐
黑鲨吃西瓜9 小时前
鸿蒙通用模块
harmonyos·鸿蒙
rannn_1111 天前
【力扣hot100】238、41、73题解
java·算法·leetcode·开发
math_hongfan2 天前
鸿蒙离线数据缓存高级架构:弱网预加载/离线数据优先级/同步冲突解决/上线后数据合并策略
学习·缓存·华为·架构·harmonyos·鸿蒙
math_hongfan2 天前
鸿蒙企业级数据存储高级架构:从读写分离到冷热数据分层/归档策略/数据生命周期管理最佳实践
人工智能·学习·华为·架构·harmonyos·鸿蒙
math_hongfan2 天前
鸿蒙存储异常高级排查:文件损坏检测/数据恢复/读写失败重试/磁盘空间预警系统性根治方案
学习·华为·harmonyos·鸿蒙
math_hongfan2 天前
鸿蒙存储碎片高级清理机制:数据库Vacuum/文件碎片整理/缓存过期清理/主动空间回收策略
jvm·数据库·学习·缓存·华为·harmonyos·鸿蒙
OH_TPC3 天前
【鸿蒙优选三方库】@ohos/grpc:在 HarmonyOS 上像调本地方法一样调远程服务
华为·harmonyos·鸿蒙
math_hongfan3 天前
鸿蒙Agent高级技能自定义开发:自定义意图服务/能力注册/Agent技能编排/服务插件开发实战
android·学习·华为·harmonyos·鸿蒙
math_hongfan3 天前
鸿蒙AI权限与隐私保护高级:智能数据脱敏/端侧处理优先/数据最小化采集/隐私计算技术栈
人工智能·学习·华为·harmonyos·鸿蒙
math_hongfan3 天前
鸿蒙多模态AI交互高级:图文+语音+手势融合交互/多模态大模型端侧适配/跨模态检索高阶实战
人工智能·学习·华为·交互·语音识别·harmonyos·鸿蒙