理解<? extends T>和<? super T>

19 阅读1分钟

在 Java 泛型中存在通配符的概念:

<? extends T>:上界通配符(Upper Bounds Wildcards)表示?匹配的类型都是类型T的子类

<? super T>: 下界通配符(Lower Bounds Wildcards) 表示?匹配的类型都是T的父类

从编译器的角度理解上面的区别:

首先理解车的例子:单车是车的子类,单车有车的特性可以代表车,但是车不能代表单车。即类型向上兼容向下不兼容。

<? extends C>

add() : 编译器只知道元素类型是 C 或 C 的子类,所以有可能是 C D E F 其中一个类型,为保证类型安全不能添加除了 null 以外的任何元素,即使是 C 本身也不行(车不能代表单车).

get() : 既然编译器不知道此时集合中的元素是 C D E F 的哪一个,返回类型只能是他们共同父类 C 类型

<? super C>

add() : 编译器只知道元素类型是 C 或者 C 的父类,所以有可能是 A B C 其中一个类型。编译器知道下界是 C ,根据类型向上兼容所以可以添加的元素是 C 以及 C 的子类(单车可以代表车)

get() : 既然编译器不确定集合类型是 A B C 的哪一种,返回类型只能是他们的共同父类 Object

特点:<? extends C> 的 add() 被限制,<? super C> 的 get() 被限制