困境
泛型不可能三角
泛型困境的本质是,关于泛型,你想要缓慢的程序员、缓慢的编译器和臃肿的二进制文件,还是缓慢的执行时间。简单来说就是:要么苦了程序员,要么苦了编绎器,要么降低运行时效率。
不同语言对泛型的考量
以C、C++和Java为例,它们在泛型的设计上有着不同考量:
- C语言:是系统级的编程语言,没有支持泛型,本身提供的抽象能力非常有限。结果是牺牲了程序员的开发效率,与Golang目前的做法一样,它们都需要手动实现不同类型的相同逻辑。但是不引入泛型的好处也显而易见,那就是降低了编译器实现的复杂度,也能保证源代码的编译速度;
- C++语言:与C语言的选择完全不同,它使用编译期间类型特化实现泛型,提供了非常强大的抽象能力。虽然提高了程序员的开发效率,不再需要手写同一逻辑的相似实现,但是编译器的实现变得非常复杂,泛型展开会生成的大量重复代码也会导致最终的二进制文件膨胀和编译缓慢,我们往往需要链接器来解决代码重复的问题;
- Java:在1.5版本引入了泛型,它的泛型是用类型擦除实现的。Java的泛型只是在编译期间用于检查类型的正确,为了保证与旧版本JVM的兼容,类型擦除会删除泛型的相关信息,导致其在运行时不可用。编译器会插入额外的类型转换指令,与C语言和C++在运行前就已经实现或者生成代码相比,Java类型的装箱和拆箱会降低程序的执行效率
实现泛型的方式
原文:
https://cloud.tencent.com/developer/article/1898560