在java.util.Collections中有这样一个方法
![](https://img-blog.csdn.net/20170306133432967)
这里是在定义泛型 添加extends限制时 使用了泛型通配符 作为类型。
publicstatic <TextendsComparable<? super T>>void sort(List<T>list)
意思就是说,传进来的这个类型T得实现/继承自Comparable<?super T>。
Textends Comparable<?super T>
注意这里虽然Comparable是接口,但是依然是用extends,参见“定义&传递”章节extends interface小节。即
Timplements Comparable<?super T>
Java Code
| public class Fruit { } class Apple extends Fruit implements Comparable<Object>{ @Override public int compareTo(Object o) { return 0; } } //class Apple extends Fruit implements Comparable<Fruit>{ // // @Override // public int compareTo(Fruit o) { // return 0; // } // //} // //class Apple extends Fruit implements Comparable<Apple>{ // // @Override // public int compareTo(Apple o) { // return 0; // } // //} 这样不行 //class Apple extends Fruit implements Comparable<FujiApple>{ // // @Override // public int compareTo(FujiApple o) { // return 0; // } // //} class Pear extends Fruit{ } class FujiApple extends Apple{ } |
如果给Apple再嵌套泛型的时候,还可以这样
Java Code
| class Apple<T> extends Fruit implements Comparable<Apple<T>>{ @Override public int compareTo(Apple<T> o) { return 0; } } |
Java Code
| ArrayList<Apple<Object>> list1 = new ArrayList<Apple<Object>>(); Collections.sort(list1); ArrayList<Apple<String>> list2 = new ArrayList<Apple<String>>(); Collections.sort(list2); |
但实际上做实验的时候还手残写了这样的,并且这个在传Apple<Object>的时候还可以通过,但是在传apple<Integer>的时候就露馅了。
Java Code
| 这个只有T传Object的时候可以编译通过 class Apple<T> extends Fruit implements Comparable<T>{ @Override public int compareTo(T o) { return 0; } } |
![](https://img-blog.csdn.net/20170306133447271)
这是因为传Object的时候带入Apple<T>中是
Apple<Object> extends Fruitimplements Comparable<Object>
是满足
Timplements Comparable<?super T>
Apple<Object>implements Comparable<? superApple<Object>>
的