仓颉语言泛型接口深度解析:从标准库 Iterable 到自定义可遍历容器
文档编程语言【免费下载链接】cangjie_docs仓颉编程语言开发者文档。项目地址https://gitcode.com/Cangjie/cangjie_docs点击查看免费下载泛型接口是仓颉语言抽象与复用的核心机制之一它允许在声明接口时暂不固定成员涉及的具体类型而由使用者在使用时指定。本篇以标准库Iterable/Iterator/Collection为切入点系统讲解泛型接口的定义、继承、约束与型变规则并结合本仓库 泛型系列文档 与 集合遍历文档给出可直接落地到自定义容器的实战方案。读完本篇你将能独立定义带类型形参的接口、让自定义类型接入for-in遍历并理解泛型约束与子类型关系的底层规则。为什么接口需要泛型类型形参的引入仓颉语言中的泛型即参数化类型——一个在声明时未知、需要在使用时指定的类型。在 泛型概述 中定义了四个贯穿整个泛型体系的核心术语类型形参类型或函数声明中需要在使用处被指定的类型声明时给定标识符以便在声明体中引用类型变元在声明体中通过标识符引用这些类型形参时的称呼类型实参使用泛型声明时实际传入的具体类型类型构造器需要零个、一个或多个类型作为实参的类型。例如ListT中的T是类型形参elem: OptionT中对T的引用是类型变元ListInt64中的Int64是类型实参而List本身是类型构造器。仓颉中function、class、interface、struct与enum的声明都可以带类型形参。接口作为只描述行为、不包含数据的抽象类型见 接口文档当其成员函数的行为与某个未知类型相关时就必须引入泛型参数。标准库示例Iterable、Iterator 与 Collection以标准库中定义的Iterable为例它的成员函数iterator需要返回一个Iterator类型该类型是容器的遍历器。Iterator内部有从容器类型中取出下一个元素的next成员函数而next的返回类型需要在使用时指定因此Iterator必须声明泛型参数。核心定义如下public interface IterableE { func iterator(): IteratorE } public interface IteratorE : IterableE { func next(): OptionE } public interface CollectionT : IterableT { prop size: Int64 func isEmpty(): Bool }逐行解读这段示例IterableE声明类型形参E元素的类型。iterator()返回IteratorE即遍历E类型元素的遍历器。凡是实现了IterableE的类型都可通过iterator()获得一个可逐元素取值的遍历器。IteratorE : IterableEIterator继承Iterable因此遍历器本身也可被遍历这是仓颉中接口继承接口的典型写法:表示子类型关系。next(): OptionE每次调用返回OptionE有元素时返回Some(e)遍历完毕返回None。CollectionT : IterableTCollection在IterableT基础上新增成员——属性size: Int64容器大小与成员函数isEmpty(): Bool是否为空。这说明泛型接口在继承时可以新增成员形成更具体的抽象层次。需要说明的是本示例出自 泛型接口文档用于讲解接口也可以是泛型的。而 Iterable 和 Collections 文档 展示了标准库实际形态的差异真实标准库中的IteratorT是以内置抽象类abstract class形式提供的同样通过:声明与IterableT的继承关系并提供next(): OptionT。无论接口还是抽象类形式其核心都一致——通过类型形参T将元素类型参数化。泛型接口的继承与实现接口继承一个接口可以继承多个接口接口可以继承一个或多个接口但不能继承类且继承时允许添加新的接口成员。泛型接口同样遵循这一规则例如上面的CollectionT : IterableT。若需同时继承多个用连接interface Calculable : Addable Subtractable { func mul(other: Int64): Int64 func div(other: Int64): Int64 }实现Calculable的类型必须同时补齐加减乘除全部成员。同理实现CollectionT的类型必须同时实现iterator()、next()若Iterator要求以及size属性与isEmpty()。实现途径与要求根据 接口文档仓颉中除 Tuple、VArray 和函数外的其他类型都可以实现接口共有三种途径在定义类型时直接声明实现class Foo : I通过扩展实现接口详见 扩展由语言内置实现。实现接口时需满足成员函数与操作符重载函数的名称、参数列表、返回类型与接口声明一致成员属性要求mut修饰一致且类型相同接口成员默认具有public语义实现类型也必须用public实现。唯一的例外是若接口成员返回类型为 class 类型实现函数允许返回其子类型。泛型接口作为泛型约束where 子句与带实参的接口泛型接口最常见的用途之一是作为其他泛型声明的约束。在 泛型约束文档 中约束通过where关键字声明where T1 : Interface1 Interface2表示T1必须同时实现Interface1与Interface2逗号,用于分隔不同形参的约束。只有声明了约束才能在泛型函数或泛型类型中调用对应接口的成员。泛型接口作为约束时必须带上类型实参。例如 泛型类文档 中的Map键值对节点open class NodeK, V where K : Hashable EquatableK { var key: OptionK OptionK.None var value: OptionV OptionV.None // ... }这里Equatable是泛型接口作为约束使用时写作EquatableK——即K必须实现与自身比较的相等性判定。K : Hashable EquatableK意为K需同时实现Hashable与EquatableK两个接口。再看一个泛型函数中使用接口约束的完整示例来自 泛型约束文档func genericPrintT(a: T) where T : ToString { println(a) } main() { genericPrintInt64(10) }输出10若传入未实现ToString的类型如一个函数类型(Int64) - Int64编译器会抛出泛型类型参数不满足约束的错误。泛型接口的型变规则用户自定义泛型不型变泛型接口实例化后同样存在子类型关系但仓颉对其有严格限制。泛型类型的子类型关系文档 给出了型变的精确定义对类型构造器T与类型参数X不型变T(A) : T(B)当且仅当A B协变T(A) : T(B)当且仅当A : B逆变T(A) : T(B)当且仅当B : A。仓颉规定所有用户自定义的泛型类型含泛型接口在其所有类型变元处都是不型变的。因此给定interface IX即便D : C成立ID : IC也不成立——只有A B时才有IA : IB。例外是内建类型内建元组类型对其元素类型协变内建函数类型在入参处逆变、返回处协变。这一限制牺牲了部分表达能力但规避了协变数组运行时抛异常一类安全问题。泛型接口的成员泛型成员函数与静态泛型函数接口的成员可以是实例的或静态的也可以本身是泛型的。泛型函数文档 展示了 interface 中定义泛型成员函数与静态泛型函数的写法import std.collection.ArrayList interface M { func fooT(a: T): T static func toStringT(b: ArrayListT): String where T : ToString } class C : M { public func fooS(a: S): S { // 实现 M::foo泛型参数名可以不同 a } public static func toStringT(b: ArrayListT) where T : ToString { var res for (s in b) { res s.toString() } res } }要点有二其一接口中的泛型成员函数与非泛型函数一样具有open语义实现时泛型形参名称不必与接口声明一致其二接口的静态成员函数或属性可以有默认实现也可没有——当约束泛型变元T为某接口子类型并在泛型函数中以T.typename()方式访问静态成员时需要保证T的实例化类型中所有静态成员都有实现见 接口文档 中的printTypeName示例。实战实现泛型接口让自定义容器支持 for-in 遍历泛型接口最有价值的实战场景就是让自定义类型接入语言内置的遍历语法。根据 Iterable 和 Collections 文档Range、Array、ArrayList 等都是通过实现Iterable来支持for-in的开发者自定义类型也可以做到。以下这段for-in代码let list [1, 2, 3] for (i in list) { println(i) }在底层等价于基于iterator()与next()的 while 循环let list [1, 2, 3] var it list.iterator() while (true) { match (it.next()) { case Some(i) println(i) case None break } }也可以写成在 while 条件中使用模式匹配的等价形式let list [1, 2, 3] var it list.iterator() while (let Some(i) - it.next()) { println(i) }基于此我们可以定义一个泛型的自定义列表MyListT实现IterableT接口并配套一个实现遍历逻辑的MyListIteratorT按本文讲解的接口视角编写标准库中Iterator以抽象类形态提供继承写法一致均需提供next实现import std.collection.ArrayList class MyListT : IterableT { var items: ArrayListT ArrayListT() public func add(item: T) { items.add(item) } public func iterator(): IteratorT { MyListIteratorT(this) } } class MyListIteratorT : IteratorT { let list: MyListT var index: Int64 0 init(list: MyListT) { this.list list } public func next(): OptionT { if (index list.items.size) { let item list.items[index] index 1 return Some(item) } else { return None } } } main() { let ml MyListInt64() ml.add(1) ml.add(2) ml.add(3) for (i in ml) { println(i) } }运行后将依次打印1、2、3。这里的机制与标准库容器完全一致for-in通过iterator()拿到遍历器反复调用next()直到返回None。同时IteratorT : IterableT这一继承关系保证了遍历器本身也可以被for-in或嵌套遍历继续消费。若容器需要被当作CollectionT使用还需补上size属性与isEmpty()成员。小结泛型接口把抽象行为与待定类型结合在一起是仓颉泛型体系与面向接口编程的交叉点。通过 泛型接口文档 的Iterable/Iterator/Collection示例我们掌握了其定义与继承写法结合本仓库 泛型约束、泛型子类型关系、接口 与 Iterable 和 Collections 等文档进一步理解了接口约束、不型变规则、泛型成员函数以及for-in的底层展开逻辑。建议继续阅读 泛型类、泛型函数、泛型结构体 与 泛型枚举以获得对仓颉泛型机制的完整认识。赞分享文档编程语言【免费下载链接】cangjie_docs仓颉编程语言开发者文档。项目地址https://gitcode.com/Cangjie/cangjie_docs点击查看免费下载相关推荐仓颉语言集合遍历基石Iterable 接口与 for-in 语法深度解析仓颉语言集合遍历基石Iterable 接口与 for in 语法深度解析 Iterable 与 Iterator 是仓颉标准库中支撑所有集合遍历能力的一对核心文档编程语言仓颉语言 Iterable 与 Iteratorfor-in 遍历机制与自定义集合实现指南仓颉语言 Iterable 与 Iteratorfor in 遍历机制与自定义集合实现指南 导读 本文围绕仓颉Cangjie编程语言标准库中的 Itera文档编程语言仓颉语言泛型接口详解以 Iterable 与 Iterator 为例掌握参数化抽象的接口设计仓颉语言泛型接口详解以 Iterable 与 Iterator 为例掌握参数化抽象的接口设计 在仓颉编程语言Cangjie中泛型接口是连接“抽象行为契约文档编程语言创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

如何在不破坏Agent循环的前提下扩展它?learn-agent-architecture 钩子(Hooks)与生命周期事件实战

如何在不破坏Agent循环的前提下扩展它?learn-agent-architecture 钩子(Hooks)与生命周期事件实战

【免费下载链接】learn-agent-architecture Learn AI agents from scratch. 项目地址: https://gitcode.com/gh_mirrors/aw/learn-agent-architecture 点击查看 免费下载 learn-agent-architecture 是一个逐层拆解 AI Agent 外层架构(Harness&#xff0…

2026/10/15 20:16:49 阅读更多 →
facebook-android-sdk 实战指南:FBLoginSample 示例中的 Facebook 登录、权限管理与发帖实现

facebook-android-sdk 实战指南:FBLoginSample 示例中的 Facebook 登录、权限管理与发帖实现

移动开发认证鉴权社交 【免费下载链接】facebook-android-sdk Used to integrate Android apps with Facebook Platform. 项目地址: https://gitcode.com/gh_mirrors/fa/facebook-android-sdk 点击查看 免费下载 导读 FBLoginSample 是 facebook-android-sdk 仓库…

2026/10/15 20:16:49 阅读更多 →
无线传播路径建模从入门到实战:自由空间损耗与链路预算全解析

无线传播路径建模从入门到实战:自由空间损耗与链路预算全解析

做无线覆盖、物联网部署和系统集成的朋友,大概都经历过这样一个场景:现场信号测了几十轮,数据总比仿真预测低一截,设备商说天线没问题,集成商说现场环境太复杂,最后谁也没给出一个能复用的结论。要走出这种…

2026/10/15 20:15:48 阅读更多 →

最新新闻

Java字符串转数字的正确方法

Java字符串转数字的正确方法

java中把字符串转成 的方法更新时间为二零二三年七月七日零九点四十分零三秒, 作者是。在Java环境里头, 大家可以利用某个类里面的那个叫作静态的方法, 把一段写着数字的字符串变成对应那种类型的数, 这篇文章会配上一些具体的代码例子, 来把这个事情从字符串弄成具体数值的过程…

2026/10/16 3:12:01 阅读更多 →
3ds Max角色动画骨骼绑定全流程:模型准备、蒙皮权重与避坑指南

3ds Max角色动画骨骼绑定全流程:模型准备、蒙皮权重与避坑指南

简介:面向3ds Max角色动画学习者的教学PPT课件,聚焦角色动画设计与骨骼绑定核心流程。课件系统讲解了创建骨骼结构、Bones内置系统与Character Studio工具的结合使用,重点区分直接连接与蒙皮连接两种支配模型的方式;围绕软性骨骼蒙…

2026/10/16 3:12:01 阅读更多 →
先查供电、天线和传感器 CRC:方案测试怎么跟硬件同事对话

先查供电、天线和传感器 CRC:方案测试怎么跟硬件同事对话

副标题:松天线、拔传感器、波特率设错,各记一层;先给数据再让人改版 专栏:《嵌入式学生的方案测试课》第 15 篇(软硬件联测) 前置:第 1 篇环境表;第 5 篇四层;第 9 篇没有…

2026/10/16 3:12:01 阅读更多 →
混沌拓扑学(HDT)灰度思想与布劳威尔直觉主义、选择序列与展形——排中律失效后的数学重构

混沌拓扑学(HDT)灰度思想与布劳威尔直觉主义、选择序列与展形——排中律失效后的数学重构

前言 在经典数学体系中,排中律被视为不可撼动的逻辑公理:对于任意命题 PPP,必然满足 P∨PP \lor \neg PP∨P。 通俗表述为:任何命题非真即假,不存在第三种状态,不存在未确定状态,不存在中间灰度…

2026/10/16 3:12:01 阅读更多 →
浪潮AS5300/AS5500双控存储安装调试指南:从级联到映射

浪潮AS5300/AS5500双控存储安装调试指南:从级联到映射

简介:浪潮存储AS5300/AS5500安装调试指导文档,面向企业级存储实施、运维及售前售后工程师,解决新设备上架、初始化配置、业务上线和故障定位过程中的操作盲区。内容按七个环节组织:先给出设备规格与扩展柜SS5000J-16/SS5000J-24物…

2026/10/16 3:12:01 阅读更多 →
小白程序员必看:AI大模型落地实战指南,从入门到精通

小白程序员必看:AI大模型落地实战指南,从入门到精通

本文深入探讨AI大模型应用落地过程中的关键环节,强调企业需求明确、模型流程整合及持续优化的重要性。文章指出,AI应用需从模糊需求明确化,到模型接入可用流程,再到真实使用中的持续改进。通过分析FDE工程师的核心能力&#xff0c…

2026/10/16 3:11:01 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →