仓颉编程语言:泛型函数

仓颉编程语言:泛型函数
最新回答
遗心遗梦遗快乐

2026-05-28 00:44:37

仓颉编程语言中的泛型函数允许函数处理多种数据类型,同时保持类型安全。

泛型函数通过在函数名后使用尖括号 < > 声明类型形参,支持全局、局部、成员函数及静态函数等多种场景。以下是详细说明:

1. 全局泛型函数

在函数名后声明类型形参,可在参数、返回类型及函数体中使用。示例:

// 定义泛型函数 id,返回输入值本身func id<T>(a: T): T { return a}// 复合两个函数的泛型函数func composition<T1, T2, T3>(f: (T1) -> T2, g: (T2) -> T3): (T1) -> T3 { return {x: T1 => g(f(x))}}// 使用示例func times2(a: Int64): Int64 { return a * 2 }func plus10(a: Int64): Int64 { return a + 10 }func times2plus10(a: Int64): Int64 { return composition<Int64, Int64, Int64>(times2, plus10)(a)}main() { println(times2plus10(9)) // 输出 28}

关键点:

  • 类型形参 T、T1, T2, T3 在声明时无需指定具体类型,由调用时推断。
  • 适用于需要处理多种类型的场景(如函数复合)。
2. 局部泛型函数

泛型函数可嵌套定义在其他函数内部。示例:

func foo(a: Int64): Bool { func id<T>(a: T): T { return a } func double(a: Int64): Int64 { return a + a } // 验证函数复合的等价性 return (id<Int64> ~> double)(a) == (double ~> id<Int64>)(a) // 输出 true}main() { println(foo(1)) // true}

关键点:

  • 局部泛型函数的作用域仅限于外层函数内。
  • 可通过 ~> 操作符复合函数。
3. 泛型成员函数

类(class)、结构体(struct)、枚举(enum)的成员函数支持泛型。示例:

class A { func foo<T>(a: T): Unit where T <: ToString { println("${a}") }}struct B { func bar<T>(a: T): Unit where T <: ToString { println("${a}") }}enum C { | X | Y func coo<T>(a: T): Unit where T <: ToString { println("${a}") }}main() { var a = A() var b = B() var c = C.X a.foo<Int64>(10) // 输出 10 b.bar<String>("abc") // 输出 abc c.coo<Bool>(false) // 输出 false}

限制:

  • 类中的泛型成员函数不能用 open 修饰(否则报错)。
4. 扩展中的泛型函数

通过 extend 为现有类型添加泛型成员函数。示例:

extend Int64 { func printIntAndArg<T>(a: T) where T <: ToString { println(this) // 输出当前 Int64 值 println("${a}") // 输出泛型参数 }}main() { var a: Int64 = 12 a.printIntAndArg<String>("twelve") // 输出 12 和 twelve}5. 静态泛型函数

在接口、类、结构体、枚举或扩展中定义静态泛型函数。示例:

import std.collection.*class ToPair { public static func fromArray<T>(l: ArrayList<T>): (T, T) { return (l[0], l[1]) }}main() { var res = ArrayList([1, 2, 3, 4]) var a = ToPair.fromArray<Int64>(res) // 返回 (1, 2)}总结
  • 语法:类型形参通过 <T> 声明,多个参数用逗号分隔。
  • 应用场景:全局函数、局部函数、成员函数、扩展及静态函数。
  • 类型约束:可通过 where 子句限制类型形参(如 T <: ToString)。
  • 优势:提高代码复用性,同时保持类型安全。

通过泛型函数,仓颉语言能够灵活处理多类型场景,避免重复代码,同时确保类型正确性。