您的位置:首页 > 编程语言 > Java开发

传智播客-Java基础加强-day7

2011-01-15 23:08 204 查看
今天学的泛型,几乎没有什么头绪,不过为了进入黑马,为了提高自己,我鼓励自己必须坚持,加油……I can play……

偷了下懒,拷贝了一段张老师的课件,以备以后复习:

编译器判断泛型方法的实际类型参数的过程称为类型推断,类型推断是相对于知觉推断的,其实现方法是一种非常复杂的过程。
根据调用泛型方法时实际传递的参数类型或返回值的类型来推断,具体规则如下:
1、当某个类型变量只在整个参数列表中的所有参数和返回值中的一处被应用了,那么根据调用方法时该处的实际应用类型来确定,这很容易凭着感觉推断出来,即直接根据调用方法时传递的参数类型或返回值来决定泛型参数的类型,例:
Swap(new String[3],3,4)—static <E> void swap(E[] a,int I,int j)
2、当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时这多处的实际应用类型都对应同一种类型来确定,这很容易凭着感觉推断出来,例:
add(3,5)—static <T> 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.5f) – static <T> T add (T a, T b)
5、参数类型的类型推断具有传遍性,下面第一种情况推断实际参数类型为Object,编译没有问题,而第二种情况则根据参数化的Vector类实例将类型变量直接确定为String类型,编译将出现问题:
copy(new Integer[5],new String[5]) -- static <T> void copy(T[] a , T [] b);
copy (new Vector<String>(),new Integer[5]) -- static <T> void copy(Collection<T> a,T[] b);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: