A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 奋发吧小白 高级黑马   /  2014-9-1 20:14  /  1331 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 奋发吧小白 于 2014-9-1 21:33 编辑

张老师的泛型推断总结自己整理下供大家复习:
类型参数的类型推断
编译器判断泛型方法的实际类型参数的过程为类型推断,类型推断是相对于知觉推断的,其实现方法是一种非常复杂的过程。根据调用泛型方法时实际传递的参数类型或返回值类型来推断,具体规则如下:

1,当某个类型变量只在整个参数列表中的所有参数和返回值中的一处被应用了,那么根据调用方法时该处的实际应用类型来确定,这很容易凭着感觉推断出来,即直接根据调用方法时传递的参数类型或返回值来决定泛型的类型,
例如:swap(new String[3],3,4)-------->static<E>void swap (e[]a,int i,int j)




2,当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时这多处的实际应用类型都对应同一种类型来确定,这很容易凭着感觉推断出来,
例如:add(3,5)--------->static<T> add(T a,T b)



3,当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了。如果调用方法时这多处的实际应用类型对应到了不同的类型,且没有使用返回值,这时候取多个参数中的最大交集类型,例如:下面语句实际对应的类型就是Number了,编译时没问题,只是运行时出问题:
fill(new Integer[3],3,5f)->static<T> void fill(T[] a,T v)




4,当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时多处的实际应用类型对应了不同的类型,并且使用返回值,这时候优先考虑返回值的类型,例如,下面的语句实际对应的类型就是Integer了,编译将报告错误,将变量X的类型改为float 对比eclipse报告的错误提示,接着再将变量X类型改为number则没有错误了
int x = (3,3.5)->static<T> Tadd(T a, T b )




5,参数类型推断具有传递性,下面第一种情况推断实际参数类型为Object 编译没有问题,而第二种情况则根据参数化的Vector类实例将类型变量直接确定为String类型,编译将出现问题:
copy(new Integer[5],new String[5])->static <T>void copy(T[] a,T[] b)


评分

参与人数 1技术分 +1 收起 理由
舍我其谁 + 1

查看全部评分

4 个回复

倒序浏览
很不错,加油
回复 使用道具 举报
看看,学习一下
回复 使用道具 举报
总结的真好
回复 使用道具 举报
总结很好!就是实际操作起来困难很多
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马