zoukankan      html  css  js  c++  java
  • 38_泛型的通配符扩展应用

    • 问题:

      • 定义一个方法,该方法用于打印出任意参数化类型的集合中的所有数据,该方法如何定义呢?

    • 错误的方式

    public static void printCollection(Collection<Object> cols){
        for(Object obj:cols){
            System.out.println(obj);
        }
        /**
        cols.add("string");//没错
        cols=new HashSet<Date>();//会报告错误!
        */
    }

     

    • 正确的方式:

    public static void printCollection(Collection<?> cols){
        for(Object obj:cols){
            System.out.println(obj);
        }
        /**
        cols.add("string");//错误,因为他不知道自己未来匹配就一定是Stirng
        cols.size();//没错,此方法与类型参数没有关系
        cols=new HashSet<Date>();//没错,可以和 Collection<?>画等号
        */
    }
    • 总结:
      • 使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。

    上图中,大红叉的方法都是和类型相关的,在使用泛型通配符?时,不能调用。

    Collection<?> a可以和任意参数化的类型匹配,但到底匹配的是什么类型,只有以后才知道,所以,

    a=new ArrayList<Integer>();和 a= new ArrayList<String>();都可以,但a.add(new Date);或者 a.add("abc");都不行。

     

    Cols<Object>中的Object只是说明Cols<Object>实例对象中的方法接收的参数是Object

    Cols<Object>是一种具体类型,new HashSet<Date>也是一种具体类型,两者没有兼容性。

     

     

     

     

    • 泛型中?通配符的扩展

      • 限定通配符的上边界

        • 正确  Vector<? extends Number> x=new Vector<Integer>();

        • 错误   Vector<? extends Number> x=new  Vector<String>();

      • 限定通配符的下边界

        • 正确  Vector<? super Integer> x=new Vector<Number>();

        • 错误  Vector<? super Integer> x=new Vector<Byte>();

      • 提示

        • 限定通配符总是包括自己

  • 相关阅读:
    JAVA并发编程学习笔记之ReentrantLock
    服务架构演进
    Java集群优化——dubbo+zookeeper构建高可用分布式集群
    Dubbo实例
    hessian学习
    JAVA分布式事务原理及应用
    了解AngularJS $resource
    AngularJS Resource:与 RESTful API 交互
    Hibernate解决高并发问题之:悲观锁 VS 乐观锁
    互联网金融高并发方案
  • 原文地址:https://www.cnblogs.com/qq-757617012/p/4263797.html
Copyright © 2011-2022 走看看