<T:Any>的通用约束与没有约束<T>之间的区别是什么

Jav*_*r C 6 generics swift

我已经看到一些使用约束的代码,<T: Any>并且无法找到文档之间的差异而不指定约束.是否存在任何差异,例如限制非选项?

Ham*_*ish 5

约束确实是多余的,因为所有类型都是Any(包括Optional)的子类型.

在内部,编译器实际上将类型建模为由零协议组成的Any协议组合类型
(例如P1 & P2).没有办法在语言中拼写这个,这就是为什么标准库中没有定义的原因1,它只是一个被解析为类型的关键字.Any

因此,约束T : Any在字面上被解释为" T必须符合这个空协议列表中的所有协议",这显然是一个冗余约束.真的,编译器应该对它发出警告(我实际上已经开始研究这样做的补丁 - 本周某个时候打开拉取请求一切顺利).

1. 当协议组成拼写而不是拼写时Any,过去在标准库中定义为typealiasfor .protocol<>protocol<P1, P2>P1 & P2