Skip to content

玄铁泛型编程指南 ​

泛型允许你编写可复用的代码,操作不同类型的数据而无需为每种类型重复实现。玄铁的泛型语法简洁直观,与类型系统深度整合。


泛型类 ​

使用 型 定义类时,在类名后添加 <T> 来声明泛型参数。类内部可以像使用普通类型一样使用 T。

基础示例:容器 ​

xuantie
// 定义一个泛型容器类
型 盒子<T> {
    设 内容: T

    函 造(初始内容: T) {
        此.内容 = 初始内容
    }

    函 获取(): T {
        返 此.内容
    }
}

// 实例化整数盒子
设 整盒 = 造 盒子<整>(123)
示("整盒内容: #{整盒.获取()}")  // 输出: 整盒内容: 123

// 实例化字符串盒子
设 字盒 = 造 盒子<字>("玄铁")
示("字盒内容: #{字盒.获取()}")  // 输出: 字盒内容: 玄铁

泛型参数命名 ​

泛型参数使用尖括号 < > 包裹,多个参数用逗号分隔:

xuantie
型 键值对<K, V> {
    设 键: K
    设 值: V

    函 造(k: K, v: V) {
        此.键 = k
        此.值 = v
    }
}

泛型函数 ​

在 函 关键字后的函数名后添加 <T> 来定义泛型函数。调用时在函数名后添加 <具体类型>。

基础示例:交换 ​

xuantie
函 交换<T>(a: T, b: T) {
    返 [b, a]
}

设 换后 = 交换<整>(10, 20)
示("交换结果: #{换后}")  // 输出: 交换结果: [20, 10]

泛型函数与类型标注 ​

泛型函数支持完整的类型注解:

xuantie
函 恒等<T>(x: T): T {
    返 x
}

示(恒等<字>("你好"))  // 输出: 你好
示(恒等<整>(42))     // 输出: 42

支持的类型参数 ​

实例化泛型时,可以使用以下类型作为类型参数:

类型关键字示例
整数整盒子<整>
字符串字盒子<字>
浮点数小数盒子<小数>
布尔布尔盒子<判>
数组数组盒子<数组>
字典字典盒子<字典>
结果结果盒子<结果>
字节字节盒子<字节>
自定义标识符T, U 等交换<T>

可空修饰符 ? ​

在泛型类型参数中,? 可以紧跟在类型后面,表示该类型可空。? 修饰的是它紧邻的那个类型——这个规则清晰且与主流语言一致。

语法规则 ​

节点?              ← 节点 可空
数组<节点>?        ← 数组 可空(整个数组可能为空)
数组<节点?>        ← 数组里的元素可空(数组本身存在)
数组<节点?>?       ← 数组可空,且元素也可空
字典<字, 节点?>    ← 字典里 value 可空
字典<字, 节点>?    ← 整个字典可空

与弱引用配合 ​

弱 修饰的字段必须是可空类型——因为它引用的对象随时可能被释放而变空:

xuantie
型 子节点 {
    弱 设 父: 父节点?    // 弱引用父节点,父可能被释放→变为空
}

型 父节点 {
    设 子: 数组<子节点>  // 强引用子节点列表
}

这里 父: 父节点? 中的 ? 明确表达了"父可能为空"的语义,而 弱 保证了不会形成循环引用。

多层 ? 的含义 ​

数组<节点?>?     ← 解读:外层的 ? 修饰数组,里层的 ? 修饰节点
                // 数组本身可空(可能为 空)
                // 数组元素也可空(某个元素可能是 空)

字典<字, 整?>    ← 字典的键不可空,值可空

当前局限 ​

注意:v0.18.0 版本中,泛型支持处于语法层。编译器采用类型擦除策略,所有泛型类型在底层均映射为 i64。这意味着:

  • 泛型参数的类型检查在编译期尚未强制执行
  • 泛型约束(<T 承 接口>)尚未实现
  • 泛型类型的运行时反射信息有限

这些功能将在后续版本中逐步完善。


完整示例 ​

xuantie
// 测试完整的泛型功能
示("--- 泛型示例 ---")

// 泛型类
型 栈<T> {
    设 数据

    函 造() {
        此.数据 = []
    }

    函 压入(元素: T) {
        此.数据.追加(元素)
    }

    函 弹出(): T {
        设 顶值 = 此.数据[此.数据.长度 - 1]
        此.数据.删(此.数据.长度 - 1)
        返 顶值
    }
}

// 使用整数栈
设 整栈 = 造 栈<整>()
整栈.压入(10)
整栈.压入(20)
示("弹出: #{整栈.弹出()}")  // 20

// 泛型函数:最大值
函 取较大<T>(a: T, b: T): T {
    若 a > b { 返 a }
    返 b
}

示("较大值: #{取较大<整>(10, 20)}")  // 20

下一篇:04_弱引用编程指南.md

基于 VitePress 静态构建 · 文档内容与仓库 GUIDE/ 同源

玄铁玄铁 XUANTIE · 中文系统级编程语言MARK 玄·折 120×120 · STROKE 8 · NO CURVES