本质:限制集合类型

我们在编写泛化类的时候,我们要时刻提醒自己,我们传入的参数T仅仅是一个Object类型,任何具体类型信息我们都是未知的。

小例子:

package day02.generic;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.junit.Test;

public class Demo2 {
    @Test
    public void test1() {
        List<String> list=new ArrayList<String>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        //传统
        Iterator<String> it=list.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
        //增强for
        for(String s :list){
            System.out.println(s);
        }
    }
    
    
    @Test
    public void test2() {
        Map<Integer,String> map=new LinkedHashMap<Integer,String>();
        map.put(1, "aaa");
        map.put(2, "bbb");
        map.put(3, "ccc");
        //传统keyset entryset
        Set<Map.Entry<Integer,String>> set =map.entrySet();
        Iterator<Map.Entry<Integer,String>> it=set.iterator();
        while(it.hasNext()){
            Map.Entry<Integer,String> entry = it.next();
            int key=entry.getKey();
            String value=entry.getValue();
            System.out.println(key+"="+value);
        }
    }
}

test2:

 类型擦除:

    类型擦除指的是通过类型参数合并,将泛型类型实例关联到同一份字节码上。编译器只为泛型类型生成一份字节码,并将其实例关联到这份字节码上。类型擦除的关键在于从泛型类型中清除类型参数的相关信息,并且再必要的时候添加类型检查和类型转换的方法。
     类型擦除可以简单的理解为将泛型java代码转换为普通java代码,只不过编译器更直接点,将泛型java代码直接转换成普通java字节码。
     类型擦除的主要过程如下:
     1.将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。
     2.移除所有的类型参数。

Just remember

1.虚拟机中没有泛型,只有普通类和普通方法
2.所有泛型类的类型参数在编译时都会被擦除
3.创建泛型对象时请指明类型,让编译器尽早的做参数检查(Effective Java,第23条:请不要在新代码中使用原生态类型)
4.不要忽略编译器的警告信息,那意味着潜在的ClassCastException等着你。

package day02.generic;

//自定义带泛型的方法
public class Demo6 <T,E,K>{
    
    public void testa(){
//        a("aaa");
    }
    public  T a(T t){
        return null;
    }
    public  void  b(T t,E e,K k){
        return;
    } 
//    public static void c(T t){
//         
//    }
    public static<T> void h(T t){
         
    }

}

 

package day02.generic;

public class Demo7 {
    //编写一个泛型方法,实现指定位置上的元素交换
    public <T>void swap(T arr[],int pos1,int pos2){
        
        T temp=arr[pos1];
        arr[pos1]=arr[pos2];
        arr[pos2]=temp;
    }
    
    
}

 

posted on 2016-11-14 15:28  Snowing杨雪莹  阅读(170)  评论(0编辑  收藏  举报