博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java泛型中的? super T语法
阅读量:4921 次
发布时间:2019-06-11

本文共 921 字,大约阅读时间需要 3 分钟。

 

? 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;
}

很严谨的函数头,但是限定方面比较宽

转载于:https://www.cnblogs.com/foxspecial/p/3242160.html

你可能感兴趣的文章
HDU 1069 Monkey and Banana(DP)
查看>>
HDU 2577 How to Type(杭电300题纪念)
查看>>
CS224n学习笔记(二)
查看>>
pymysql模块
查看>>
面向对象chapter7
查看>>
关于gcc、glibc和binutils模块之间的关系
查看>>
NB的新技术
查看>>
让vim能完成代码提示~~
查看>>
【Android】java.lang.StackOverflowError: stack size 8MB
查看>>
12 个 CSS 高级技巧汇总
查看>>
Node.js 系列01
查看>>
源码下编译APK,却是总是提示,找不到符号:SystemProperties 。。。
查看>>
Apache Jmeter(1)
查看>>
Lattice Planner规划算法
查看>>
JS基础--问题记录
查看>>
简易代码生成器
查看>>
Spring对HibernateSession的管理之封装SessionFactory
查看>>
awk-使用
查看>>
maven常用命令
查看>>
WPF制作多语言版本的程序
查看>>