黑马程序员_第八天_高新技术之泛型

时间:2023-02-18 13:13:28
---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ---------------------- 

       今天是第八天了,眼看高新技术即将学完,心里既高兴又紧张,因为这部分知识有些难度,生怕自己掌握不了。打开电脑发现今天讲的是泛型。泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入。
以前我们学过集合的例子:
ArrayList collection1 = new ArrayList();
collection1.add(1);
collection1.add(1L);
collection1.add("abc");
int i = (Integer)collection1.get(1);
继而引申到集合元素的类型:
ArrayList<String> collection2 = new ArrayList<String>();
collection2.add("abc");
String element = collection2.get(1);
以上集合具体使用的是字符串类型,所以使用起来显得不太灵活。如果使用泛型的话,编译器编译带类型说明的集合时会去除掉“类型”信息,使程序运行效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型一样。
ArrayList<Integer> collection3 = new ArrayList<Integer>();
System.out.println(collection3.getClass()==collection2.getClass())
collection3.getClass().getMethod("add",Object.class).invoke(collection3,"abc");
System.out.println(collection3.get(0));
以上是泛型在反射知识中的应用。由此得出泛型的定义:ArrayList<E>.
E称为类型变量和类型参数,ArrayList<Integer>称为参数化类型,ArrayList称为原始类型,Integer称为实例或实际类型参数。现定义一个方法来打印出集合中的所有数据:
public static void printCollection(Collection<?>cols){
    for(Object obj:cols){
          System.out.println(obj);
    }
举个例子说明泛型集合的实际应用:
HashMap<String,Integer> maps = new HashMap<String,Integer>();
maps.put("zxx",28);
maps.put("lhm",35);
maps.put("flx",33);
Set<Map.Entry<String,Integer>> entrySet = maps.entrySet();
for(Map.Entry<String,Integer> entry:entrySet){
    System.out.println(entry.getKey()+":"+entry.getValue());
}
以上例子一定不会陌生,因为是HashMap的知识,我们以前都接触过。不过这只是jdk中的基本类型,那么我们想自己自定义泛型可不可以呢?
add(3,5);
Number x1 = add(3.5,3);
Object x2 = add(3,"abc");
swap(new String[]{"abc","xyz","itcast"},1,2);
swap(new String[]{1,3,5,4,5},3,4);
private static <T> T add(T[] a,int i,int j){
   T tmp = a[i];
   a[i] = a[j];
   a[j] = tmp;
}
以上是我们初学java时的交换元素方法,现应用到集合泛型中。使用自定义泛型的例子还有很多,例如:编写一个泛型方法,自动将Object类型的对象转换成其他类型:
private static <T> T autoConvert(Object obj){
   return (T)obj;
}
将任意类型的数组中元素填充为相应类型的某个对象:
private static <T> T void fillArray(T[] a,T obj){
  for(int i=0;i<a.length;i++){
     a[i] = obj;
   }
}
常用的增、删、改、查操作:
GenericDao<E>
add(E x),findById(int id),delete(E obj),delete(int id),update(E obj)
findByUserName(String name)
通过反射获得泛型的实际参数:
Method applyMethod = GenericTest.class.getMethod("applyVector",Vector.class);
Type[] types = applyMethod.getGenericParameterTypes();
ParameterizedType pType = (ParameterizedType)types[0];
System.out.println(pType.getRawType());
System.out.println(pType.getActualTypeArguments()[0]);
        哈哈,感觉学着挺有意思的。虽然代码有些多,参数、类型定义起来也比较麻烦,但这丝毫不能抹杀泛型的巨大好处,也希望大家能重视起来。

---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------详细请查看:<a href="http://edu.csdn.net/heima" target="blank">http://edu.csdn.net/heima</a>