---------------------- android培训、java培训、期待与您交流! ----------------------
ArrayList <Integer> list2 = new ArrayList <Integer>();
//以下使用反射在使用泛型<Integer>的集合中中加入字符串
list2.getClass().getMethod("add", Object.class).invoke(list2, "abc");
System.out.println(list2.get(0));//在runtime时,不存在泛型实例
//参数化类型与原始类型的兼容性
Vector v1 = new Vector <String>();//原始类型可以引用一个参数化类型的对象
Vector <Object> v2 = v1;//参数化类型可以引用一个原始类型的对象(这里编译器把v1看作是一个原始类型)
//以下内容为类型推断
Integer x = add(3, 4);
Number x1 = add(3.5, 6);//float与int的类型交集为Number
Object x2 = add("a", 665);//String与int的类型交集为Object
private static <T> T add(T x,T y){//用于类型推断的方法
return y;
}
//运用泛型向任意类型的集合中添加,相应类型的数组内容
private static <T> void add(Collection <T> dest,T src[]){
for(T s : src){
dest.add(s);
}
}
//以下是通过反射获得泛型的的实际参数类型
Method method = GenericTest.class.getMethod("applyGenericDao", GenericDao.class);
Type[] types = method.getGenericParameterTypes();//Method类提供取得泛型形参类型数组
ParameterizedType pType = (ParameterizedType)types[0];//ParameterizedType是Type的一个子类
System.out.println(pType.getRawType());//运用ParameterizedType的方法返回此类型的类
System.out.println(pType.getActualTypeArguments()[0]);//返回实际类型参数的Type对象
package HEIMA_annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Date;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
import HEIMA_refelct.ReflectPoint;
public class GenericTest {
public static void main(String[] args) throws SecurityException, NoSuchMethodException,
IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
ArrayList list1 = new ArrayList ();//没有使用泛型,编译出现警告
list1.add(1);
list1.add("d");
ArrayList<String> list = new ArrayList <String>() ;
// list.add(1);
list.add("a");
// list.add(1L);
String i = list.get(0);
//new String (new StringBuffer("abc"))反射中使用到泛型
Constructor<String> constructor = String.class.getConstructor(StringBuffer.class);
String str = constructor.newInstance(new StringBuffer("abc"));
System.out.println(str);
ArrayList <Integer> list2 = new ArrayList <Integer>();
//true;字节码相同,说明泛型是提供给编译器使用的,在runtime时没有泛型
System.out.println(list.getClass() == list2.getClass());
//list2.add("abc");编译不通过,因为使用了泛型
//以下使用反射在使用泛型<Integer>中加入字符串
list2.getClass().getMethod("add", Object.class).invoke(list2, "abc");
System.out.println(list2.get(0));
//参数化类型与原始类型的兼容性
Vector v1 = new Vector <String>();//原始类型可以引用一个参数化类型的对象
Vector <Object> v2 = v1;//参数化类型可以引用一个原始类型的对象(这里编译器把v1看作是一个原始类型)
HashMap <String, Integer> maps = new HashMap <String, Integer>();
maps.put("zxx", 4);
maps.put("lhm", 2);
maps.put("zlx", 32);
Set <Map.Entry <String, Integer>> entrySet = maps.entrySet();//HashMap无法进行迭代,必须通过entrySet()方法先转化为Set
for(Map.Entry <String, Integer> entry : entrySet){
System.out.println(entry.getKey()+":"+entry.getValue());
}
//以下内容为类型推断
Integer x = add(3, 4);
Number x1 = add(3.5, 6);//float与int的类型交集为Number
Object x2 = add("a", 665);//String与int的类型交集为Object
swap(new String []{"abc","xyz","jkl"}, 0, 2);
// swap(new int[]{1,2,3}, 0, 2);//编译不通过,只有引用类型才能成为泛型的实际参数,int是基本类型
Object obj = "123";
String str1 = autoconvert(obj);//运用泛型转换,但是数据不对会报错
System.out.println(str1);
String fillArrayVal = "abc";//运用泛型,在任意类型的数组中,填入相应类型的对象
String [] b = new String[2];
fillArray(b, fillArrayVal);
copy1(new Vector <String>(), new String [10]);
copy2(new Date[10], new String [10]);//类型推断为Date和String的交集(Object)
// copy1(new Vector <Date>(), new String [10]);//编译不通过,前面指定Date,泛型具有传递性,后面也应为Date
//以下为自定义泛型类的应用
GenericDao<ReflectPoint> dao = new GenericDao <ReflectPoint>();
dao.add(new ReflectPoint(3,2));//GenericDao类定义了泛型,这里add方法的参数只能是ReflectPoint对象!
// String string = dao.findById(1);//编译不通过,定义了泛型,返回类型只能是ReflectPoint类型
//以下是通过反射获得泛型的的实际参数类型
Method method = GenericTest.class.getMethod("applyGenericDao", GenericDao.class);
Type[] types = method.getGenericParameterTypes();//Method类提供取得泛型形参类型数组
ParameterizedType pType = (ParameterizedType)types[0];//ParameterizedType是Type的一个子类
System.out.println(pType.getRawType());//运用ParameterizedType的方法返回此类型的类
System.out.println(pType.getActualTypeArguments()[0]);//返回实际类型参数的Type对象
}
public static void applyGenericDao(GenericDao<ReflectPoint> dao){
}
private static <T> void fillArray(T[] a,T obj){//运用泛型,在任意类型的数组中,填入相应类型的对象
for(T a1 : a){
a1 = obj;
System.out.println(a1);
}
}
private static <T> T autoconvert(Object obj){//运用泛型自动将Object对象转换为其他对象(类型错误也会报强制转换错)
return (T)obj;
}
private static <T> void swap(T a[],int i,int j){//转换数组中任意2个元素的位置
T temp = a[i];
a[i] = a[j];
a[j] = temp;
}
private static <T> T add(T x,T y){//用于类型推断的方法
return y;
}
private static void printCollection(Collection <?> collection,int i ){//运用通配符,打印任意类型的集合
System.out.println(collection.size());
for(Object arg : collection){
System.out.println(arg);
}
// collection.add(i);使用通配符后不能使用add方法
}
private static <T> void printCollection2(Collection <T> collection,T obj){//运用泛型,打印任意类型的集合(使用通配符更有效)
System.out.println(collection.size());
for(Object arg : collection){
System.out.println(arg);
}
collection.add(obj);//使用泛型后可以使用add方法!
}
private static <T> void copy1(Collection <T> dest,T src[]){//运用泛型向任意类型的集合中添加,相应类型的数组内容
for(T s : src){
dest.add(s);
}
}
private static <T> void copy2(T []dest,T src[]){//相同类型的数组传值
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima
分享到:
相关推荐
NULL 博文链接:https://840198532-qq-com.iteye.com/blog/1491352
NULL 博文链接:https://840198532-qq-com.iteye.com/blog/1490705
day02_Collection、泛型 day03_List、Set、数据结构、Collections day04_Map,斗地主案例 day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda表达式 day08_File类、递归 day09_字节流、字符流...
JAVA设计模式--程序设计--反射--注解--泛型
基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....
泛型 反射 概念 方法 使用
反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。 比如: Pool<Point> pool = new Pool(){}; Point p = pool.get(x, y); //在此构造Point对象 ... pool.put(p); 希望能帮助那些为查找泛型构造器、...
Java试题-3:反射和泛型的综合应用 Java反射 泛型都是比较高级的应用技术
对java泛型以及反射机制进行原理和应用上的讲解,帮助初学者对这两个概念进行更轻松的掌握
java泛型+反射使用的源码,比较详细,欢迎下载
DataReader反射泛型实体对象。数据库已有。完整的例子。
java的基于泛型+反射的通用DAO例子,原创,没事写着玩的,请多指教哈。。。
反射+泛型+三层 ^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^
在C#中通过反射操作一个List泛型。。
详细介绍了JAVA泛型和反射,对学习JAVA很有帮助哦!!!!
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是...
Java 反射与泛型教程 资源为视频教程资源 希望对你的 Java 学习有所帮助。
先说一下遇到的问题:通过使用GSON泛型进行报文转换的时候想要对部分关键字段加密,发现在封装好的方法中,对个别字段的加密满足不了。 解决过程:首先通过反射获取到bean下的对象名称。 对象名称获取到了之后需要...
同时,因为反射会带来性能损失,因此,可根据自己需求,针对每个类型轻松在两种模式之前切换,本例源码,测试实例俱全,而且代码浅显易懂,只要对泛型、反射、三层架构有一定了解的人都能轻松学习
Java基础入门(四)-泛型、反射、注解