• java之泛型潜在错误


    如果使用带泛型声明的类时,没有传入类型参数,那么这个类型参数默认是声明该参数时指定的第一个上限类型,这个类型参数被称为raw type(原始类型 )。 

    eg: 
        public class ListTest { 
        public static void main(String[] args){ 
            List list = new ArrayList(); 
            list.add("aaaa"); 
            list.add("bbbbbbb"); 
            list.add("cccc"); 
            List<Integer> intList = list; 
            for(int i=0; i<intList.size(); i++){ 
                System.out.println(intList.get(i)); 
            } 
        } 
        } 
    输出: 
    aaaa 
    bbbbbbb 
    cccc 
    上述程序编译,及运行一切正常。可以看出当程序把一个原始类型的变量赋给一个带有泛型信息的变量时,只要它们的类型保持兼容---例如将List变量赋给List<Integer>,无论list集合里实际包含什么类型的元素,系统都不会有任何问题。不过需要指出当把一个原始类型的变量(如List变量)赋给带泛型信息的变量时会有一个潜在的问题:JVM会吧集合里盛装的所有元素当作Integer来处理。如果输出涉及到集合元素的类型,程序运行时出现ClassCastException。 
    eg: 
        public class ListTest { 
        public static void main(String[] args){ 
            List list = new ArrayList(); 
            list.add("aaaa"); 
            list.add("bbbbbbb"); 
            list.add("cccc"); 
            List<Integer> intList = list; 
            for(Integer i : intList){ 
                System.out.println(i); 
            } 
        } 
        } 
    输出结果: 
    Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer 
        at com.zb.zb.ListTest.main(ListTest.java:11) 

    eg2 

    public class ListTest { 
        public static void main(String[] args){ 
            Apple<Integer> a = new Apple<Integer>(6); 
            for(String apple :a.getApples()){ 
                System.out.println(apple); 
            } 
            Apple b = a;   (1) 
             
    //        for(String apple : b.getApples()){  (2) 
    //            System.out.println(apple); 
    //        } 
        } 


    class Apple<T extends Number>{ 
        T size; 
        public Apple(){ 
             
        } 
        public Apple(T size){ 
            this.size = size; 
        } 
        public void setSize (T size){ 
            this.size = size; 
        } 
        public List<String> getApples(){ 
            List<String> list = new ArrayList<String>(); 
            for(int i = 0; i < 3; i++) { 
                list.add(new Apple<Integer>(10 * i).toString()); 
            } 
            return list; 
        } 
        public String toString(){ 
            return "Apple[size=" + size + "]"; 
        } 
    }
    注:(1)处将Apple<Integer>对象赋给一个Apple变量,在(2)出输出时该对象的将丢失所有的泛型信息。即尖括号里的所有信息,包括getApples()方法的返回值的类型List<String>里的尖括号信息。 

    Java是不允许创建泛型数组 。 
  • 相关阅读:
    使用批处理bat作为日期系统日期的前三天
    电脑桌面显示倒退
    BZOJ 2648/2716(SJY把件-KD_Tree)[Template:KD_Tree]
    yii使用寻呼功能
    宝付额度
    vs2010旗舰版产品密钥
    考察网贷平台是否正规,仅供参考。
    sql server 修改字段大小
    帕累托分析法
    帕累托分析法(Pareto Analysis)(柏拉图分析)
  • 原文地址:https://www.cnblogs.com/woniu4/p/5559777.html
Copyright © 2020-2023  润新知