美文网首页Java
Java通配符

Java通配符

作者: 漆先生 | 来源:发表于2021-03-24 16:24 被阅读0次

    参考链接:https://blog.csdn.net/qq_35890572/article/details/80402840

    一、符号

    java中,?代表通配符,保证类型安全。

    二、用法

     1. 在实例化对象的时候,不确定泛型参数的具体类型时,可以使用通配符进行对象定义
    
     2. <? extends Object>代表上边界限定通配符
    
     3. <? super Object>代表下边界限定通配符。
    

    三、上边界限定通配符

    上边界通配符使得类型是协变的,直接使用add()方法受限,但是可以用来获取各种数据类型的数据,并赋值给父类型的引用。

    List<? extends Number> list=null;
    list=new ArrayList<Integer>();
    list.add(new Integer(1));    //报错,因为list不能确定实例化的对象具体类型导致add()方法受限
    ...
    list.get(0);    //正确
    

    正确用法:

    import java.util.ArrayList;
    import java.util.List;
    
    public class Main {
        public static void main(String[] args) {
            firstPrint();
            secondPrint();
        }
    
        public static void firstPrint() {
            List<Float> list1 = new ArrayList<>();//使用 Float作实参类型
            list1.add(12.3f);
            list1.add(23.4f);
            print(list1);
        }
    
        public static void secondPrint() {
            List<Integer> list2 = new ArrayList<>();//使用Integer作实参类型
            list2.add(1);
            list2.add(2);
            list2.add(3);
            print(list2);
        }
    
        public static void print(List<? extends Number> list) {// 通配符作形参
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i));// 使用get方法
            }
        }
    }
    
    

    四、下边界限定通配符

    下边界通配符使用get()方法受限(不使用强转),但是可以添加特定类型的值,用于将对象写入到一个数据结构里

    List<? super Integer> list = null;
    list = new ArrayList<Number>();
    list.add(1);
    Number number = list.get(0);//报错,因为List<? super Integer>不知道list存放的对象具体类型,则使用get获取到的值不确定。
    ...
    list.add(1);//正确
    

    正确用法:

    import java.util.ArrayList;
    import java.util.List;
    
    public class Main {
       public static void main(String[] args) {
           List<Number> list = new ArrayList<>();
           firstInflate(list);
           for (int i = 0; i < list.size(); i++) {
               System.out.println(list.get(i));
           }
           list.clear();
           secondInflate(list);
           for (int i = 0; i < list.size(); i++) {
               System.out.println(list.get(i));
           }
       }
    
       public static void firstInflate(List<? super Integer> list) {// 装填整数
           list.add(1);
           list.add(2);
           list.add(3);
       }
    
       public static void secondInflate(List<? super Float> list) {// 装填浮点数
           list.add(1.1f);
           list.add(2.2f);
           list.add(1.3f);
       }
    }
    

    五、总结

    • 列表内容
    • 限定通配符总是包括自己
    • 上边界限定通配符:add方法受限
    • 下边界限定通配符:get方法受限
    • 如果你想从一个数据类型里获取数据,使用 ? extends 通配符
    • 如果你想把对象写入一个数据结构里,使用 ? super 通配符
    • 如果你既想存,又想取,那就别用通配符
    • 不能同时声明泛型通配符上界和下界

    相关文章

      网友评论

        本文标题:Java通配符

        本文链接:https://www.haomeiwen.com/subject/ozchhltx.html