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开发手册》