面试被问到 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, 运行时进行类型转换。两种方式一种牺牲空间,一种牺牲时间,但做到的事情是一样的.

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Nirvana 支付宝

支付宝