关于泛型的一些知识
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]);// 得到第一个形参对应的实际参数化的类型
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]);// 得到第一个形参对应的实际参数化的类型
相关文章推荐
- 关于javascript的一些小知识
- 关于web测试的一些知识
- 关于继承的一些知识
- 关于RGB屏调试的一些知识
- javaweb_关于Servlet一些基础知识笔记
- python一些关于字符串的知识
- 关于特征工程入门中的一些基本知识(整理)
- 关于c++ 中while(cin>>temp)相关问题搜集的一些知识
- 关于一些JAVA的基础知识总结
- 关于JSP的一些小的知识适于初学者,高手勿看·
- 关于异常的一些知识
- 关于多线程的一些小知识
- 关于JVM一些知识的粗浅认识
- 谈谈关于PHP的代码安全相关的一些致命知识
- 关于Java泛型的一些思考
- 关于 URL 的一些不可不知的知识
- 关于“云运算”的一些知识。
- 关于Objective-C的一些基本知识
- 超分辨率重建——关于正则化的一些知识
- 一些关于打水知识(整理中...)