# 玄铁泛型编程指南
泛型允许你编写可复用的代码,操作不同类型的数据而无需为每种类型重复实现。玄铁的泛型语法简洁直观,与类型系统深度整合。
---
### 泛型类
使用 `型` 定义类时,在类名后添加 `<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](./04_弱引用编程指南.md)*