泛型代码详解

package cn.itcast.day2;


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;


public class GenericTest {


/**
* @param args
*/
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
ArrayList<String> collection2=new ArrayList<String> ();
collection2.add("abc");

ArrayList<Integer> collection3=new ArrayList<Integer> ();
//对于泛型,代码编译完就没有我们定义的泛型啦,也就是说ArrayList<Integer> collection3=new ArrayList<Integer> ();
//编译完为ArrayList collection3=new ArrayList();
//所以collection2与collection3为同一份字节码
//所以泛型是给编译器看的,运行时已经没有泛型痕迹
System.out.println(collection2.getClass()==collection3.getClass());


//利用泛型跳过编译器向泛型对象中传入其它类型参数
collection3.getClass().getMethod("add", Object.class).invoke(collection3, "abc");
System.out.println(collection3.get(0));
/*
参数化类型与原始类型的兼容性:
参数化类型可以引用一个原始类型的对象,编译报告警告,例如,Collection<String> c = new Vector();//可不可以,不就是编译器一句话的事吗?
原始类型可以引用一个参数化类型的对象,编译报告警告,例如,Collection c = new Vector<String>();//原来的方法接受一个集合参数,新的类型也要能传进去
*/
printCollection(collection3);

HashMap<String,Integer> maps=new HashMap<String,Integer>();
maps.put("zhangsan", 34);
maps.put("lisi", 35);
maps.put("wangwu", 36);
//获得key,value集合
Set<Map.Entry<String,Integer>> entrySet=maps.entrySet();
//打印出集合中元素
for(Map.Entry<String,Integer> entry:entrySet){
System.out.println(entry.getKey() + ":::" + entry.getValue());
}
//只有引用类型才能作为泛型方法的实际参数,swap(new int[3],3,5);语句会报告编译错误
swap(new String[]{"abc","xyz","itcast"},1,2);
//swap(new int[]{1,2,3,4,5},2,3);
Object obj="abc";
String x3=autoConvert(obj);
System.out.println(x3);

//通过反射获得泛型的参数化类型
Method applyMethod=GenericTest.class.getMethod("applyVector", Vector.class);
//获得参数的泛型类型,可能有多个所以返回一个数组
//Type 是 Java 编程语言中所有类型的公共高级接口。
//它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。
Type[] types=applyMethod.getGenericParameterTypes();
//ParameterizedType为Type子接口,ParameterizedType 表示参数化类型
//此处已知有一个参数化类型,所以直接将第一个赋值给pType
ParameterizedType pType=(ParameterizedType)types[0];

//打印出泛型参数
System.out.println(pType.getActualTypeArguments()[0]);

}

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

}
//泛型方法练习--------------------------------

//编写一个泛型方法,自动将Object类型的对象转换成其他类型。
public static <T> T autoConvert(Object obj){
return (T)obj;
}
//定义一个方法,可以将任意类型的数组中的所有元素填充为相应类型的某个对象
public static <T> void fillArray(T[] a,T obj){
for(int i=0;i<a.length;i++){
a[i]=obj;
}


}
//泛型方法练习--------------------------------


//只有引用类型才能作为泛型方法的实际参数
public static <T> void swap(T[]a,int i,int j){
T temp=a[i];
a[i]=a[j];
a[j]=temp;
}


//该方法用于打印出任意参数化类型的集合中的所有数据
public static void printCollection(Collection<?> collection){
System.out.println(collection.size());
for(Object obj:collection){
System.out.println(obj);
}
}

}



package cn.itcast.day2;


public class GenericDao<T> {
public  void add(T p){

}
public T findById(int Id){
return null;
}

/*public static void update(T obj){
//静态不能用类上定义的泛型
}*/
//静态可以使用自己定义的泛型
public static <E> void update(E obj){
}
}

分享一下我的学习资料!!!!
Java全套顶级视频
http://pro.net.itcast.cn/View-22-1435.aspx
DotNet全套视频
http://pro.net.itcast.cn/View-23-1435.aspx
PHP全套视频
http://pro.net.itcast.cn/View-24-1435.aspx
全世界最适合0基础学习编程的网上校园
http://pro.net.itcast.cn/View-25-1435.aspx
免费申请java全套视频光盘区域
http://pro.net.itcast.cn/View-26-1435.aspx




















 

posted @ 2013-04-26 19:19  javawebsoa  Views(225)  Comments(0Edit  收藏  举报