A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

lzxxiong

初级黑马

  • 黑马币:39

  • 帖子:16

  • 精华:0

© lzxxiong 初级黑马   /  2016-9-6 00:26  /  393 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

? extends E :传入的类型是E类型或者E类型的子类
? super E :传入的类型是E类型或者E类型的父类
?           :无限定

缺点:
        ? extends E :参数为泛型的方法不能使用
        ? super E :返回值为泛型的方法不能使用
        ? :参数和返回值为泛型的方法不能使用

        关于TreeSet和TreeMap传入比较器进行排序的问题.
        这里TreeMap的构造方法public TreeMap(Comparator<? super K> comparator),
        比如有一个类Person及它的子类Student,
        创建比较器的时候传入Person.
                new Comparator<Person> (){
                        @Override
                                public int compare(Person o1, Person o2) {
                                        int num = o1.getAge() - o2.getAge();
                                        return num == 0 ? o1.getName().compareTo(o2.getName()) : num;
                                }
                        }
        但是这个比较器却可以比较Student,和Person.按照定义 ? super E :传入的类型是E类型或者E类型的父类
        这里好像传入的是它的子类Student也可以.但是实际上传入Comparator对象的时候会将这个比较器comparator赋给
        这个对象里面的比较器comparator.如下所示
                        public TreeMap(Comparator<? super K> comparator) {
                                this.comparator = comparator;
                        }

        添加的时候要会把这个比较器赋值给put()方法里的 Comparator<? super K>,
        所以? super E :传入的类型是E类型或者E类型的父类是正确的.
        添加的时候会变成这样        Comparator<? super Student> cpr = comparator
        这里comparator就是自己创建的比较器.它接收的泛型是Person.所以无论创建集合的时候集合的泛型是Student还是Person
        就是说集合的put()方法中Comparator<? super K> 中的K是Student或Person.自己创建的比较器是接收的泛型是Person就是它
        的父类或者本类
       
            public V put(K key, V value) {

                //代码省略
        Comparator<? super K> cpr = comparator;
                //代码省略
      
    }

1 个回复

倒序浏览
路过学习一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马