在java.util.Collections中有这样一个方法

这里是在定义泛型 添加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;
}
}
|

这是因为传Object的时候带入Apple<T>中是
Apple<Object> extends Fruitimplements Comparable<Object>
是满足
Timplements
Comparable<?super T>
Apple<Object>implements
Comparable<? superApple<Object>>
的