• 如何理解<T extends Comparable<? super T>>


    在看java容器类的时候经常可以看到<T extends Comparable<? super T>>,感觉十分不解?

    我们觉得<T extends Comparable<T>>我们是知道的,T是实现了Comparable接口的类型,因此他们之间可以进行比较,

    <? super T>表名类型参数需要是T或T的父类,那么<T extends Comparable<? super T>>到底是什么意思呢?

    对T的约束是Comparable的子类,对Comparable中泛型的约束是,?至少是T的父类,那么就意味着T是?的子类。

    一言以蔽之:元素必须是实现了Comparable接口的类或者其子类,可以使用父类方法比较子类型

    /**
     * Created by wangbin10 on 2018/9/18.
     * mySort2() list中的元素必须是实现了Comparable接口的类或者其子类
     * Java采取的是类型擦除的方法来实现泛型,并通过extends和super关键字来约束泛型的上界和下界。
     * extends关键字用于确定泛型的上界。<A extends B>表示类B或者其子类。
     * super关键字用于确定泛型的下界,<A super B>表示类B或者其父类,一直到Object。?则是一个通配符。
     * 因此,<T extends Comparable<? super T>>表示了上界为实现了Comparable接口的类,<? super T>则表示实现Comparable接口的类的子类也可以,从而确定下界
     */
    public class Test {
        public static void main(String[] args) {
            List<Animal> animals = new ArrayList<>();
            animals.add(new Animal(25));
            animals.add(new Dog(34));
            mySort1(animals);//ok
    
            List<Dog> dogs = new ArrayList<>();
            dogs.add(new Dog(18));
            dogs.add(new Dog(19));
            /**
             * 这个编译不能通过,因为T推断是Animal,得到的是Dog,Dog没有实现Comparable,所以不行
             * mySort1(dogs);
             * */
    
            mySort2(animals);//ok
            mySort2(dogs);//ok
        }
    
        /**
         * mySort1的类型参数是T extends Comparable<T>,他要求T必须实现Comparable
         * @param list
         * @param <T>
         */
        public static <T extends Comparable<T>> void mySort1(List<T> list) {
            Collections.sort(list);
            System.out.println("mySort1 Success!");
        }
    
        /**
         * list中的元素必须是实现了Comparable接口的类或者其子类
         * @param list
         * @param <T>
         */
        public static <T extends Comparable<? super T>> void mySort2(List<T> list) {
            Collections.sort(list);
            System.out.println("mySort2 Success!");
    
        }
    }
    
    class Animal implements Comparable<Animal> {
        int age;
    
        public Animal(int age) {
            this.age = age;
        }
    
        @Override
        public int compareTo(Animal o) {
            return Integer.compare(this.age, o.age);
        }
    }
    
    /**
     * Dog根本不能implements Comparable<Dog>,因为这样就会实现两个相同的接口
     */
    class Dog extends Animal {
        public Dog(int age) {
            super(age);
        }
    }
  • 相关阅读:
    前端进击的巨人(一):执行上下文与执行栈,变量对象
    读书笔记(06)
    前端博客收藏
    Nodejs-Can't set headers after they are sent
    Mac OS安装包管理工具Homebrew教程
    webpack自动化构建脚本指令npm run dev/build
    使用express搭建node中间件
    【转】基于localStorage的资源离线和更新技术
    web前端性能优化
    Vue生命周期详解
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/10330231.html
Copyright © 2020-2023  润新知