您的位置:首页 > 其它

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

2014-03-13 16:24 330 查看
----------------------
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<String>。

System.out.println(par.getRawType());//返回 Type 对象,表示声明此类型的类或接口。

System.out.println(par.getActualTypeArguments()[0]);//返回表示此类型实际类型参数的 Type 对象的数组。

}

//第一个例子

public static <T> T add(T a,T b){

return a;

}

//第二个例子

public static <T> void swap(T[] a,int i,int j){

T temp=a[i];

a[i]=a[j];

a[j]=temp;

}

public static <T> T con(Object obj){

return (T)obj;

}

//第三个例子

public static void applyVector(Vector<String> vec){

}

}----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: