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