最近在看阿里出的一本书 —— 《码出高效 Java 开发手册》,这本书不是之前那本关于 Java 开发注意规范的手册,这本书内容还是不错的,干货满满。
在看书的时候,就看到了关于上面讲的知识点,于是想到之前在看 Java 一些源码时候,也看到一些关于这个泛型的写法,当时还没注意,比如下面关于 ThreadLocal 源码是看到的。
这样以后看 Java 的源码就能看懂这些泛型的写法了。
super T> 和 extends T> 是 Java 泛型中的 “通配符“和”边界”的概念。 - super T> : 是指“上界通配符”。 A super B 表示 A 是 B 的父类或者祖先,在 B 上面。 - extends T>:是指“下界通配符”。A extends B 表示 A 是 B 的子类或者孙类,在 B 的下面。 extends T>与 super T>两种语法,但是两者的区别非常微妙。简单来说, extends T>是 Get first,适用于消费集合元素为主的场景; super T>是 Put First,适用于生产集合元素为主的场景。 # extends T> extends T>可以赋值给任何 T 及 T 子类的集合,上界为T,取出来的类型带有泛型限制,向上强制转型为T。null可以表示任何类型,所以除nul外,任何元素都不得添加进 extends T>集合内。 # super T> super T>可以赋值给任何 T 及 T 的父类集合,下界为T。在生活中,投票选举类似于 super T> 的操作。选举代表时,你只能往里投选票,取数据时,根本不知道是谁的票,相当于泛型丢失。有人说,这只是一种生活场景,在系统设计中。很难有这样的情形。再举例说明一下,我们在填写对主管的年度评价时,提交后若想再次访问之前的链接修改评价,就会被告之:“您已经完成对主管的年度反馈,谢谢参与。" extends的场景是put功能受限,而 super的场景是get功能受限。 # 集合和泛型 下面的代码和说明出自《码出高效,Java开发手册》1 | public static void main(String[] args) { |