泛型与RTTI的关系小议

泛型与RTTI(运行时类型信息)的关系小议

     今天我的一位朋友问到我Java泛型的使用问题,在讲解的过程中引出了泛型的使用条件以及泛型与RTTI的一些东西,在此写成文章以供参考。

     关于Java中泛型以及RTTI的定义不在赘述,先来总结一下泛型的使用条件。

     笔者编写的程序不算太少,总结一下泛型的一些使用范例可以概括出需要泛型的程序过程特点,那就是程序对数据结构敏感,对数据类型不敏感。

     光看这句话可能不是很明白,我举个例子:

     问题情景[0]编写程序,输出给定数组下标为0的元素(暂且不考虑数组长为0的情况)

     就这个程序的执行过程来讲,实在是过于简单,真正的问题是没有说明需要传入传出哪种类型的数组,而且程序的整个执行过程跟类型也没有关系,只要是传入一个数组,我取出下标为0的元素返回就可以了,这既是上面那句话,对结构(数组及对应的下标访问方式)敏感,对数据类型不敏感,因此我们就让泛型出场了:

public static <T> T getZeroPosition(T[] array)
{
	return array[0];
}

上面是一个典型的泛型函数,总之, 泛型避免了我们仅仅由于类型不同而编写相似的程序过程。

对于泛型类和泛型的其他详细用法,网上有很多很好的教程,这里就不再赘述了,道理都是相同的。

       下面是泛型关于RTTI的一点问题,首先说RTTI,即运行时类型信息,用于帮助我们在程序运行上下文中确定一个引用指向的对象的“实际”类型,本身跟泛型不属于一个知识系统,不过它们还是有一些潜在关联的。

在我给朋友讲解的过程中,他是这么解决问题情景[0]的,我们看看他代码的一部分:

public static Object getZeroPosition(Object array)
{
	if(array instanceof int[])
	{
		int[] res = (int[])array;
		return res[0];
	}
	if(array instanceof float[])
	{
		float[] res = (float[])array;
		return res[0];
	}
	.
	.
	.
}
相比于泛型,使用RTTI绕了一个很大的圈子,由于返回结果的存在,使调用该过程的部分也不得不依赖RTTI来转换返回值,而且基本类型返回结果被隐式地包装成了Object浪费了一些资源。

       笔者在进行了一些思考后认为,所有泛型问题都可以转化为这种Object+RTTI的模型(不考虑基本类型和对象结构上的差异),他们完成相同的事情,但意义却不一样:

泛型在编译时由编译器确保类型的正确性,而RTTI在运行时尝试获取类型信息和类型的转换,并抛出可能的异常。

尽管在对类型不敏感时,泛型有着种种的优越特性,但大多数问题还是做不到对类型毫无依赖的,如果一个过程仅有一小部分对类型依赖,那RTTI显然是一种不错的选择。

笔者又回想起在还是一个纯小菜时,就对Collection下各种List的尖括号有很深的印象:对于要组织的各种数据类型,只需要改变尖括号中的类型信息,而操作方法都大相径庭,编译器也很负责任地检查类型的错误使用,还真是方便阿~


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值