泛型学习-通过反射获得泛型的实际类型参数

---------------------- ASP.Net+Unity开发、 .Net培训、期待与您交流! ----------------------


public class FanXingTest {



/**注意:1在对泛型类型进行参数化时,类型参数的实例必须是引用类型,不能是基本类型。
* 2当一个变量声明为泛型时,只能被实例变量和方法调用,而不能被静态变量和静态方法调用,因为静态成员是所有参数化的类所共享,所有静态成员不应该有类级别的类型参数。

*/
public static void main(String[] args) throws  Exception {
//第一个例子
int a=add(3,4);    //两个参数类型一样,返回值的类型就是参数的类型
Number b= add(3.2,5);//当两个参数类型不一样时,返回类型是这两个参数的共同类型(最大公约数)。
Object obj= add(10,"sdf");//当两个参数类型不一样时,返回类型是这两个参数的共同类型(最大公约数)。

//第二个例子
swap(new String[]{"1","2","3","4","5"},1,2);
//swap(new int[]{1,2,3,4,5},1,2);//这句话会报错,因为泛型参数只接受引用类型的参数,因int[]数组是基本类型(数组本身就是对象,不能自动装箱和拆箱),上面代码中使用的类型是基本数据类型,java会自动装箱和拆箱。
obj=1;
int s=con(obj);
System.out.println(s);

//第三个例子
//通过反射获取泛型的实际类型参数
Method metapp=FanXingTest.class.getMethod("applyVector",Vector.class);
Type[] type=metapp.getGenericParameterTypes();//得到参数类型的数组
ParameterizedType par=(ParameterizedType) type[0];//ParameterizedType表示参数化类型,如 Collection。 
System.out.println(par.getRawType());//返回 Type 对象,表示声明此类型的类或接口。
System.out.println(par.getActualTypeArguments()[0]);//返回表示此类型实际类型参数的 Type 对象的数组。

}


//第一个例子
public static T  add(T a,T b){
return a;
}
//第二个例子
public static void swap(T[] a,int i,int j){
T temp=a[i];
a[i]=a[j];
a[j]=temp;
}
public static T con(Object obj){
return (T)obj;
}
//第三个例子
public static void applyVector(Vector vec){

}
}---------------------- ASP.Net+Unity开发、 .Net培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net

你可能感兴趣的:(java高新技术学习笔记)