本帖最后由 黑马张英涛 于 2013-1-24 09:02 编辑
public static <T1> void copy1(Collection<T2> des,T3[] src){
}
为了便于理解我们给3个T都加上标号。
当对方法进行编译时,编译器会先看T2跟T3是否类型一致,一致的话T1就是该类型,
(注意看的是你给他传递的T类型,而不是T[] 类型)
如果不一致的话就会看T2的父类是否跟T3一致(具体顺序是先T2还是先T3不知道),
一致的话T1就是T3类型的,然后会把T2也认为是T3类型(只是编译的时候这样判定,实际上运行时还是自己指定的类型)
如果还不一致的话就继续往上推断,一直到出现一致类型
推断到最后是找一个公共类型而不一定是Object类,张老师的视频讲过类似的例子:
public static void main(String[] args) {
Number num1=add(1.1,3); //编译通过
Object num2=add(1.1,3); //编译也通过,(这种机制个人感觉就好像在找一个最小公倍数)
Object num3=add(1.1,"abc"); //编译也通过
}
public static <T> T add(T x,T y){
return y;
}
改为String类型的话T2 T3都是String,T1当然也是String了,跟T2是一致的,所以编译通过
|