java泛型 语法_Java泛型中的? super T语法
? super T 语法将泛型类限制为所有T的超类(包括T自身),但只能用于参数中,不可以在返回值用加以限定。
如果不加以限定,假设某个函数头为
? super Manager get()
由于编译器不知道该方法究竟会返回什么类,这样就只能用Object类来接收了。
该语法常用的一个情况是泛型类的比较
java.util.TreeSet 代表一个有序的元素为E的树,它其中的一个构造器需要一个Comparator类来比较两个元素,以E为String类时为例,此时的Comparator可以是Comparator,也可以是Comparator,但Comparator就不行,如何表示这样的限制呢?
jdk源代码中是这样的:
public TreeSet(Comparator super E> c)
这样就保证了传给构造器的Comparator是可以进行E元素的比较的。
另一个例子,java.util.Collections的max方法用于获得一个容器中的最大值,这个函数头可以这样写:
public static > T max(Collection coll)
这样就限定T为能和自己比较的类,过于严格,jdk源码是这样的:
publicstatic>T max(Collection<?extendsT>coll){
Iterator<?extendsT>i=coll.iterator();
T candidate=i.next();
while(i.hasNext()){
T next=i.next();
if(next.compareTo(candidate)>0)
candidate=next;
}returncandidate;
}
很严谨的函数头,但是限定方面比较宽