知识卡片

类型约束限定泛型占位类型的能力

专业/工作 · 756.a

内容

[[泛型用占位类型换取跨类型复用而不丢失类型安全]]里不加约束的泛型占位类型T几乎什么都做不了——连==比较都无法编译,因为编译器不知道任意类型T是否支持相等性判断(闭包就没法比较)。类型约束(<T: Equatable><T: SomeClass>)在占位类型上追加”必须符合某协议”或”必须是某类的子类”的前提条件,编译器由此获知这个未知类型至少具备哪些能力,才能在函数体内安全调用相应的方法或操作符。这揭示了泛型和协议的分工:泛型负责”同一份代码套用到不同具体类型”,协议负责在类型完全未知的情况下”声明这个未知类型至少能做什么”——两者结合,才能既写出通用代码,又不必放弃编译期的类型安全检查。

参考来源

《Swift编程权威指南》第22章《泛型》