zoukankan      html  css  js  c++  java
  • 泛型(Generic)

    本质:限制集合类型

    我们在编写泛化类的时候,我们要时刻提醒自己,我们传入的参数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;
        }
        
        
    }
    既往不恋,未来不迎,当下不杂
  • 相关阅读:
    [破解]java打包Exe工具
    weblogic:local class incompatible: stream classdesc serialVersionUID
    funny alphabet
    Apache Thrift
    nginx 学习笔记(9) 配置HTTPS服务器--转载
    nginx学习笔记(8)虚拟主机名---转载
    nginx学习笔记(7)Nginx如何处理一个请求---转载
    nginx 学习笔记(6) nginx配置文件中的度量单位
    nginx 学习笔记(5) nginx调试日志
    nginx 学习笔记(4) Connection处理方法
  • 原文地址:https://www.cnblogs.com/SnowingYXY/p/6062071.html
Copyright © 2011-2022 走看看