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}关键点:
泛型函数可嵌套定义在其他函数内部。示例:
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}关键点:
类(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}限制:
通过 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)}总结通过泛型函数,仓颉语言能够灵活处理多类型场景,避免重复代码,同时确保类型正确性。