如何理解 >


在看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);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM