当前位置: 首页 > news >正文

HarmonyOS 中的 泛型类和泛型接口

在HarmonyOS的ArkTS中,泛型类和泛型接口是实现代码复用和类型安全的重要机制,它们允许组件在定义时不指定具体类型,而是在使用时动态指定。你提供的代码很好地展示了它们的基本用法,下面我来详细解释:

泛型接口(Generic Interface)

// 定义泛型接口,T是类型变量
interface IPerson<T> {a: T;                // 属性a的类型为Tb: T[];              // 属性b是T类型的数组c: (aa: T) => T;     // 方法c接收T类型参数并返回T类型
}// 使用时指定具体类型为string
const obj: IPerson<string> = {a: "xxx",b: ["xx", "xx"],c(aa: string) {return aa;}
};

泛型接口的优势是可以为同一接口结构支持多种数据类型,而无需重复定义多个接口。例如,你可以同样创建IPerson<number>类型的对象。

泛型类(Generic Class)

// 定义泛型类,T和K是类型变量
class Person<T, K> {name: T;  // 名称属性类型为Tage: K;   // 年龄属性类型为Kconstructor(name: T, age: K) {this.name = name;this.age = age;}
}// 使用时指定具体类型:T为string,K为number
const p1 = new Person<string, number>("小明", 100);

泛型类支持多个类型变量,使类的属性和方法可以灵活适配不同数据类型。例如,你也可以创建Person<number, string>类型的实例,表示用数字作为名称,用字符串表示年龄。

泛型的主要作用

  1. 代码复用:一套逻辑支持多种数据类型,减少重复代码
  2. 类型安全:编译期进行类型检查,避免运行时类型错误
  3. 灵活性:提高代码的通用性和扩展性

实际应用示例

在HarmonyOS开发中,泛型常用于集合类、网络请求封装、状态管理等场景:

// 泛型工具类示例
class DataStore<T> {private data: T[] = [];addItem(item: T): void {this.data.push(item);}getItem(index: number): T {return this.data[index];}
}// 使用时指定类型
const userStore = new DataStore<User>();
const postStore = new DataStore<Post>();

通过泛型,你可以构建更加灵活、通用且类型安全的HarmonyOS应用代码。

在这里插入图片描述

// 泛型接口
interface IPerson<T> {a: Tb: T[]c: (aa: T) => T
}const obj: IPerson<string> = {a: "xxx",b: ["xx", "xx"],c(aa: string) {return aa}
}class Person<T, K> {name: Tage: Kconstructor(name: T, age: K) {this.name = namethis.age = age}
}
const p1 = new Person<string,number>("小明",100)@Entry
@Component
struct Index {@State message: string = 'Hello World';build() {RelativeContainer() {Text(this.message).id('HelloWorld').fontSize($r('app.float.page_text_font_size')).fontWeight(FontWeight.Bold).alignRules({center: { anchor: '__container__', align: VerticalAlign.Center },middle: { anchor: '__container__', align: HorizontalAlign.Center }}).onClick(() => {this.message = 'Welcome';})}.height('100%').width('100%')}
}
http://www.lryc.cn/news/625856.html

相关文章:

  • oc-mirror plugin v2 错误could not establish the destination for the release i
  • 力扣hot100:三数之和(排序 + 双指针法)(15)
  • 缓存-变更事件捕捉、更新策略、本地缓存和热key问题
  • 数据迁移:如何从MySQL数据库高效迁移到Neo4j图形数据库
  • 在CentOS系统中查询已删除但仍占用磁盘空间的文件
  • Docker 快速下载Neo4j 方法记录
  • 生信分析自学攻略 | R语言数据类型和数据结构
  • PG靶机 - Pebbles
  • 使用java做出minecraft2.0版本
  • 为了提高项目成功率,项目预算如何分配
  • Datawhale工作流自动化平台n8n入门教程(一):n8n简介与平台部署
  • LeetCode算法日记 - Day 16: 连续数组、矩阵区域和
  • 免费导航规划API接口详解:调用指南与实战示例
  • 海滨浴场应急广播:守护碧海蓝天的安全防线
  • Shopee本土店账号安全运营:规避封禁风险的多维策略
  • 云存储的高效安全助手:阿里云国际站 OSS
  • 技术攻坚全链铸盾 锁定12月济南第26届食品农产品安全高峰论坛
  • https如何保证传递参数的安全
  • 学习嵌入式的第二十一天——数据结构——链表
  • 乾元通渠道商中标六盘水应急指挥能力提升项目
  • 路由器最大传输速率测试
  • 首届机器人足球运动会技术复盘:从赛场表现看智能机器人核心技术突破
  • GTSAM中实现多机器人位姿图优化(multi-robot pose graph optimization)示例
  • 用机器人实现OpenAI GPT-5视觉驱动的闲聊:OpenAIAPI Key获取并配置启动视觉项目
  • sfc_os!SfcQueueValidationRequest函数分析之sfc_os!IsFileInQueue
  • 当MySQL的int不够用了
  • 差速转向机器人研发:创新驱动的未来移动技术探索
  • 实现进度条
  • 1分钟批量生成100张,Coze扣子智能体工作流批量生成人物一致的治愈系漫画图文(IP形象可自定义)
  • 华为鸿蒙系统SSH如何通过私钥连接登录