JAVA泛型特例化_Go Internals: Go 反射 vs Java 泛型 vs cpp 模板

go反射 vs java范型 vs cpp模板

0 简述

Go语言并不支持范型编程(某些内置函数是支持范型的,但是用户自定义函数不支持范型),但是可以借助reflect来一定程度上弥补这部分能力的缺失,因为要靠运行时计算所以有运行时开销,性能比不上真正的范型实现。

Java支持真正的“范型”,泛型编程的好处是,编译时对类型安全性进行检查,并且模板参数可以是任意类型不用做类型转换,既安全又方便。由于是在编译时进行类型检查,并且Java编译器会对类、方法、变量级别的模板参数进行类型擦除(Type Erasure,简单理解就是将模板参数替换成Object类型或者第一个Bound的类型),无运行时开销,比Go借助反射模拟范型性能好,也不用像C++一样拷贝代码引起编译速度下降或者代码尺寸膨胀。点击查看:Java-Type-Erasure。

C++通过“模板”来支持“范型”编程,之所以加引号,是因为C++不是真正的支持范型编程,模板特例化时编译器其实是生成了一个新类的代码。C++模板是通过Macro来进行处理的,相当于复制、粘贴了类模板的代码,并替换了模板参数类型。简言之,就是一个高级的Macro处理系统。但是因为拷贝了代码,代码膨胀导致了编译速度下降、文件尺寸增加。

网上有很多相关的讨论,这里举个示例简单总结一下。

1 C++ 类模板

#include

using namespace std;

template

class Calc{

T t1;

T t2;

public:</

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值