zoukankan      html  css  js  c++  java
  • 泛型与集合的注意事项

    一.List,List<Object>,List<?>三者区别

    1.List

    (1)List可以接受任意泛型赋值

    List list = new ArrayList();
    List list1 = new ArrayList<Object>();
    List list2 = new ArrayList<Integer>();

    (2)List可以赋值给任意类型

    • 注意遍历时可能会出现类型转换异常,这是由于list中可能存放不同类型数据导致转换不了

    List list = new ArrayList();
    list.add(111);
    list.add(222);
    
    List<Integer> list1 = list;
    
    list1.forEach(System.out::println);
    • 将 list.add(222) 改为 list.add("222") 再执行就会出错
    Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
        at java.util.ArrayList.forEach(ArrayList.java:1249)
        at code.TestDemo.main(TestDemo.java:16)

    2.List<Object>

    (1)List<Object>可以接受List赋值

    List list = new ArrayList();
    List<Object> list2 = list;

    (2)List<Object>不可以赋值给List<Integer>,同时List<Integer>也不可以赋值给List<Object>

    • 确定类型的集合是不可以相互赋值的

    3.List<?>

    • List<?>在接受了其他泛型赋值之后,可以删除和清除元素 list2.remove(0); , list2.clear(); 

    • List<?>在接受了其他泛型赋值之后,不可以添加元素 list2.add(1); 

    List<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    
    List<?> list2 = list;
    list2.remove(0);
    list2.clear();

    二.<? extends T>和<? super T>

     1.<? extends T>

    (1)只允许接受T类型或T类型的子类赋值

    List<Integer> list1 = new ArrayList<>();
    List<Number> list2 = new ArrayList<>();
    List<? extends Number> list = list1;
    list = list2;

    (2)不能使用add方法添加新元素,只能添加null

    • 不能 list.add(1); 

    List<Integer> list1 = new ArrayList<>();
    list1.add(1);
    list1.add(2);
    
    List<? extends Number> list = list1;
    list.add(null);

    (3)取出元素只能使用T类型以及T类型的父类接收

    List<Integer> list1 = new ArrayList<>();
    list1.add(1);
    list1.add(2);
    
    List<? extends Number> list = list1;
    Number number = list.get(0);
    Object number1 = list.get(0);

    2.<? super T>

    (1) 只允许接受T类型或T类型的父类赋值

    List<Integer> list1 = new ArrayList<>();
    List<Number> list2 = new ArrayList<>();
    
    List<? super Integer> list = list1;
    list = list2;

    (2)只能使用add方法添加T类型元素或T类型的子类型元素

    List<Integer> list1 = new ArrayList<>();
    List<? super Integer> list = list1;
    list.add(new Integer(1));

    (3)取出类型只能使用Object类型接收

    List<Object> list1 = new ArrayList<>();
    list1.add(new Animal());
    list1.add(new Person());
    list1.add(new Man());
    
    List<? super Man> list = list1;
    Object obj = list1.get(1);
  • 相关阅读:
    C++ Primer 有感(异常处理)(二)
    C++ Primer 有感(异常处理)
    C++ Primer 有感(多重继承与虚继承)
    C++ Primer 有感(面向对象编程)
    C++ Primer 有感(重载操作符)
    yii小部件
    [BAT]通过schtasks.exe远程调用windows 2008 server上的计划任务,提示ERROR : Access is denied
    [BAT]远程执行或停止计划任务
    [Jmeter]通过批处理调用java,java从CSV动态读取登录的用户名和密码,并将其作为参数组合成字符串,写入外部.bat文件,然后通过Java执行这个外部批处理文件
    [Jmeter]Xpath获取元素某个属性的值,以及获取最后一个元素某个属性的值
  • 原文地址:https://www.cnblogs.com/zhihaospace/p/12597763.html
Copyright © 2011-2022 走看看