闲聊八卦,朋友来了一句:
.net的泛型和Java的泛型有啥区别,为啥.net可以做基元类型的泛型,而Java不可以,以及跟C++的模板啥区别?
然后我就懵了,这。。。毕业后一直摸的是动态语言,菜菜的我因为最近正好也要熟悉下我们这边服务端(Java),就认真的查了查朋友的问题
(PS:朋友的后续聊天:C++的模板也会有问题,他带来了代码的膨胀,他带来了代码的膨胀;Java的泛型也有自身的问题,Java的泛型做的是类型擦除,这样对于基元类型要做一次装箱;.Net的泛型我觉得好看,但是Java之所以没有这么做,我觉得是因为历史原因;所以千万别只局限js;所以有时候真要追求性能,我们就会自己写数据结构)
泛型编程是自 STL(标准模板库)纳入到 C++ 标准以后才逐渐流行起来的新范式,核心思想是“一切皆为类型”,或者说是“参数化类型”“类型擦除”,使用模板而不是继承的方式来复用代码,所以运行效率更高,代码也更简洁。
在 C++ 里,泛型的基础就是 template 关键字,然后是庞大而复杂的标准库,里面有各种泛型容器和算法,比如 vector、map、sort,等等。
论文指路:
- http://stepanovpapers.com/genprog.pdf
- https://www.microsoft.com/en-us/research/publication/design-and-implementation-of-generics-for-the-net-common-language-runtime/?from=http%3A%2F%2Fresearch.microsoft.com%2Fpubs%2F64031%2Fdesignandimplementationofgenerics.pdf
TypeScript-文档指路:
https://www.tslang.cn/docs/handbook/generics.html