• Java学习笔记29(集合框架三:泛型)


    泛型的概念:

    简单地讲,就是同一个方法(类),可以接受不同的数据类型并运行得到相对应的结果,不会出现安全问题

    上一篇有一段这样的代码:

    没有定义集合类型、迭代器类型

    package demo;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    
    public class CollectionDemo {
        public static void main(String[] args) {
            //集合可以存储任意类型的对象
            //集合中,不指定存储的数据类型,也可以存储
            Collection c1 = new ArrayList();
            c1.add("abc");
            c1.add("def");
            Iterator it1 = c1.iterator();
            while(it1.hasNext()){
                //it.next获取Object类型,强制转换
                String s1 = (String)it1.next();
                System.out.println(s1.length());
            }
        }
    }

    这里会有隐患:如果add(1);,自动装箱成Integer类型,无法转换成String,发生类型的转换异常

    java中提出了泛型的概念,来解决这个问题:

    package demo;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    
    public class GenericDemo {
        public static void main(String[] args) {
            function();
        }
        
        public static void function(){
            Collection<String> c1 = new ArrayList<String>();
            c1.add("abc");
            c1.add("def");
            Iterator<String> it1 = c1.iterator();
            while(it1.hasNext()){
                String s1 = it1.next();
                System.out.println(s1);
            }
        }
    }

    这时候如果add(1);,在编译的时候会无法通过,解决了安全问题

    其实这里的泛型,是伪泛型,这里只是一个编译的手段,如果不是String类型,编译无法通过,否则编译成功

    而编译后的class文件里面不存在泛型,但是由于编译过程中处理了类型问题,所以最后运行也是安全的

    泛型的方法(了解即可,没有实际应用价值):

    package demo;
    
    import java.util.ArrayList;
    
    public class GenericDemo {
        public static void main(String[] args) {
            ArrayList<Integer> array = new ArrayList<Integer>();
            // ArrayList集合内有方法toArray泛型方法
            array.add(123);
            array.add(456);
    
            Integer[] i = new Integer[(array.size())];
            Integer[] j = array.toArray(i);
            for (Integer k : j) {
                System.out.println(k);
            }
        }
    }

    同样存在泛型的接口,泛型类等,目的都是为了解决安全问题并且方便使用者,并且带来了增强for循环

    泛型的通配符?:

    package demo;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.HashSet;
    import java.util.Iterator;
    
    public class GenericDemo {
        public static void main(String[] args) {
            ArrayList<String> array = new ArrayList<String>(); 
            array.add("abc");
            array.add("def");
            
            HashSet<Integer> set = new HashSet<Integer>();
            set.add(123);
            set.add(456);
            
            iterator(array);
            iterator(set);
        }
        //要求定义一个方法,可以同时迭代两个集合
        public static void iterator(Collection<?> c){
            Iterator<?> it1 = c.iterator();
            while(it1.hasNext()){
                System.out.println(it1.next());
            }
        }
    }
  • 相关阅读:
    Leetcode 1414. 和为 K 的最少斐波那契数字数目(贪心)
    A ConvNet for the 2020论文阅读笔记
    Leetcode 957. N 天后的牢房(暴力)
    洛谷P1879 [USACO06NOV]Corn Fields G(状压DP)
    CF1553D Backspace(双指针)
    26
    37
    36
    3.4
    3.3
  • 原文地址:https://www.cnblogs.com/xuyiqing/p/8276197.html
Copyright © 2020-2023  润新知