面试被问到 c++ 的泛型和 java 的泛型有什么区别,回答得不是很好,来总结一下.
# 1. 泛型实现
# (i).c++
c++ 的泛型实现机制很简单,就是在实际编译时,类似于宏一样,把实际的类型代入模板,并针对不同的类型生成不同的代码,所以编译后代码体积会变大,但执行时就不需要额外的判断了,运行时效率会较高.
所以 c++ 的泛型可以说是以空间换时间.
# (ii).java
java 的泛型则比较复杂,java 在编译时,它会去执行类型检查和类型推断,然后生成普通的不带泛型的字节码,这种字节码可以被一般的 Java 虚拟机接收并执行,这种技术被称为擦除 (erasure).
java 编译后不同类型的模板类编译出的是同一份代码。然后在使用时编译器会帮助进行类型转换.
例如:
原代码为:
Pair<String> pair = new Pair<>("", ""); | |
pair.setFirst("QMI"); | |
pair.setSecond("Kang"); | |
String first = pair.getFirst(); | |
String second = pair.getSecond(); |
反编译后为:
Pair pair = new Pair("", ""); | |
pair.setFirst("QMI"); | |
pair.setSecond("Kang"); | |
String first = (String)pair.getFirst(); | |
String second = (String)pair.getSecond(); |
所以 java 泛型的实现是在运行时去进行判断和类型转换的,这样会对运行时的效率有一定影响,但编译出来的泛型类的代码只需要一份.
# 2. 总结
c++ 是以泛型类为模板创建出各种不同的实例,而 java 只是在类上填入 Object, 运行时进行类型转换。两种方式一种牺牲空间,一种牺牲时间,但做到的事情是一样的.