您的位置:首页 > 其它

关于泛型的一些知识

2012-09-16 15:58 459 查看
package cn.itcast.myexecise;

import java.lang.reflect.Method;

import java.lang.reflect.ParameterizedType;

import java.lang.reflect.Type;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

public class MyGenerecTest {

public static void main(String[] args) {

ArrayList<String> list1 = new ArrayList<String>();

list1.add("dada");

ArrayList<Integer> list2 = new ArrayList<Integer>();

// 上面加入的泛型在编译过之后的字节码中是要去掉指定的参数化类型的(即list1去掉String list2去掉Integer类型) 可以通过下面的测试验证

// 结论就是 泛型是给编译器看的在运行的时候 字节码中是没有任何参数化类型的

//System.out.println(list1.getClass() == list2.getClass());

// 可以通过反射机制 在编译之后 重新给增加参数化类型

try {

/**

* 通过下面的代码 在反射后在给集合增加原本不属于他的参数化类型 仍旧可以输出结果 再一次证明 泛型的作用范围

*/

//list2.getClass().getMethod("add", Object.class).invoke(list2, "adg");

//list2.getClass().getDeclaredMethod("add", Object.class).invoke(list2, "adg");

//System.out.println(list2.get(0));

/**

* getDeclaredMethod 该对象反映此 Class 对象所表示的类或接口的指定已声明方法

* getMethod 它反映此 Class 对象所表示的类或接口的指定公共成员方法 必须是public类型的

* Method method = MyGenerecTest.class.getDeclaredMethod("sayHello", String.class);

System.out.println(method);

*/

/**

*

HashMap<String, Integer> maps = new HashMap<String, Integer>();

maps.put("hello1", 1);

maps.put("hello2", 2);

maps.put("hello3", 2);

Set<Map.Entry<String,Integer>> entrySet = maps.entrySet();

for(Map.Entry<String, Integer> entry : entrySet) { // 此时 集合map 就被拆分为一个个的用entry实体封装的集合set

System.out.println(entry.getKey() + entry.getValue());

}

*/

//Object obj = "adc";

//Integer str = autoConver(obj);//定义好了返回值是什么样的 那么方法的T就是什么样的

//System.out.println(str);

/*-------------------------------通过泛型得到方法参数的实际类型-----------------------------------------------------------*/

Method method = MyGenerecTest.class.getMethod("applyVector", List.class);

Type[] types = method.getGenericParameterTypes();// 得到方法的形参对象

ParameterizedType type = (ParameterizedType) types[0];// 我们知道被调用方法的第一个参数为参数化类型的 因此直接强转

System.out.println(type.getRawType());

System.out.println(type.getActualTypeArguments()[0]);// 得到第一个形参对应的实际参数化的类型

} catch (Exception e) {

e.printStackTrace();

}

}

protected String sayHello(String str) { return "dadada";}

// 自定义泛型

private static <T> T add(T x, T y){

return y;

}

// 编写一个泛型方法 自动将Object类型的对象转换成其他类型 这样在调用方 定义好了返回值是什么 那么这个方法的T就是什么样的

private static <T> T autoConver(Object obj){

return (T)obj;

}

// 定义一个方法,可以将任意类型的数组中的所有元素填充为相应类型的某个对象

public static void applyVector(List<Date> v1){

}

}

获取方法中参数泛型的类型代码:

Method method = MyGenerecTest.class.getMethod("applyVector", List.class);

Type[] types = method.getGenericParameterTypes();// 得到方法的形参对象

ParameterizedType type = (ParameterizedType) types[0];// 我们知道被调用方法的第一个参数为参数化类型的 因此直接强转

System.out.println(type.getRawType());

System.out.println(type.getActualTypeArguments()[0]);// 得到第一个形参对应的实际参数化的类型
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  泛型知识