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源码是这样的:
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) {
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Iterator<? extends T> i = coll.iterator();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
T candidate = i.next();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
while(i.hasNext()) {
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
T next = i.next();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if (next.compareTo(candidate) > 0)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
candidate = next;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return candidate;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
很严谨的函数头,但是限定方面比较宽
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树