知识卡片

泛型用占位类型换取跨类型复用而不丢失类型安全

专业/工作 · 756

内容

给类型或函数声明加上尖括号占位类型(如struct Stack<Element>func myMap<T,U>(...)),就能写出一份代码同时服务Stack<Int>Stack<String>等任意具体类型,编译器在使用处把占位类型替换成实际类型(”特化”),因此Stack<Int>Stack<String>是两个不同的具体类型,互相不能传递彼此的元素。这与用Any之类的顶层类型实现”通用容器”的路子完全不同:泛型在编译期就锁定了每个实例内部元素的具体类型,push一个字符串到Stack<Int>会直接编译失败,而不是留到运行时才发现类型不对——泛型是”不知道具体类型、但仍然要类型安全”这个矛盾的解法,代价是编译器要多做一步类型替换和检查的工作。

参考来源

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