您的位置:首页 > 编程语言 > Java开发

Java泛型中的? super T语法

2016-04-15 17:15 459 查看

原文链接 http://www.blogjava.net/zellux/archive/2007/08/15/136940.html

? super T 语法将泛型类限制为所有T的超类(包括T自身),但只能用于参数中,不可以在返回值用加以限定。

如果不加以限定,假设某个函数头为

? super Manager get()

由于编译器不知道该方法究竟会返回什么类,这样就只能用Object类来接收了。

该语法常用的一个情况是泛型类的比较

java.util.TreeSet<E> 代表一个有序的元素为E的树,它其中的一个构造器需要一个Comparator类来比较两个元素,以E为String类时为例,此时的Comparator可以是Comparator<String>,也可以是Comparator<Object>,但Comparator<Integer>就不行,如何表示这样的限制呢?

jdk源代码中是这样的:

public TreeSet(Comparator<? super E> c)

这样就保证了传给构造器的Comparator是可以进行E元素的比较的。

另一个例子,java.util.Collections的max方法用于获得一个容器中的最大值,这个函数头可以这样写:

public static <T extends Comparable<T>>  T max(Collection<T> coll)

这样就限定T为能和自己比较的类,过于严格,jdk源码是这样的:


public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) {


    Iterator<? extends T> i = coll.iterator();


    T candidate = i.next();




    while(i.hasNext()) {


    T next = i.next();


    if (next.compareTo(candidate) > 0)


        candidate = next;


    }


    return candidate;


}
很严谨的函数头,但是限定方面比较宽
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 泛型