泛型方法有返回值 所以 T 的类型是有返回值决定的。
泛型方法类型参数的类型判断
编译器判断泛型方法的实际类型参数的过程称为类型推断,类型推断是相对于知觉推断的
其实现方法是以一种非常复制的过程。
根据调用泛型方法时实际传入的参数类型或返回值的类型来推断,具体规则如下:
1,当某个类型变量只在整个参数列表中的所有参数和返回值中的一处被应用了,那么根据调用方法时
该处的实际类型类确定,这很容易凭感觉推断出来,
eg:swap(new String[3],3,4) --> static <E> void swap(E[] a,int i, int j); String
2,当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时这多处
的实际应用类型都对应同一种类型来确定,这很容易凭感觉推断出来
eg:add(3,5) --> static <T> add(T a,T b); Integer
3, 当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时这多处
的实际应用类型都对应到了不同的类型,并且没有返回值,这时候读取多个参数中的最大交际类型,
例如,下面语句实际对应的类型是Number了,编译没问题,只是运行时出问题:
fill(new Integer[3],3.5f)--> static <T> fill(T[] a,T v); Nubmer
4, 当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时这多处
的实际应用类型都对应到了不同的类型,并且使用返回值,这时候优先考虑返回值的类型,例如
下面的语句实际对应的类型是Integer,编译将报告错误,将变量x的类型改为float,对比eclipse的
错误提示,int x = add(3,3.5) --> static <T> T add(T a,T b); Integer
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> c,T[] t); String |