# Java泛型 - 通配符与上下界

**URL:** <https://www.isharkfly.com/t/java/7000>\
**Category:** 程序语言\
**Created:** [May 23, 2013, 7:19pm UTC](https://www.isharkfly.com/t/java/7000 "2013-05-23T19:19:16Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [May 23, 2013, 7:19pm UTC](https://www.isharkfly.com/t/java/7000/1 "2013-05-23T19:19:16Z")

</div>

在使用泛型类的时候，既可以指定一个具体的类型，如List就声明了具体的类型是String；也可以用通配符?来表示未知类型，如List\<?\>就声明了List中包含的元素类型是未知的。

通配符所代表的其实是一组类型，但具体的类型是未知的。List\<?\>所声明的就是所有类型都是可以的。但是List\<?\>并不等同于List。List实际上确定了List中包含的是Object及其子类，在使用的时候都可以通过Object来进行引用。

而List\<?\>则其中所包含的元素类型是不确定。其中可能包含的是String，也可能是 Integer。如果它包含了String的话，往里面添加Integer类型的元素就是错误的。正因为类型未知，就不能通过new ArrayList\<?\>()的方法来创建一个新的ArrayList对象。因为编译器无法知道具体的类型是什么。但是对于 List\<?\>中的元素确总是可以用Object来引用的，因为虽然类型未知，但肯定是Object及其子类。考虑下面的代码：[code]public void wildcard(List\<?\> list) {  
list.add(1);//编译错误  
} [/code]如上所示，试图对一个带通配符的泛型类进行操作的时候，总是会出现编译错误。其原因在于通配符所表示的类型是未知的。

因为对于List\<?\>中的元素只能用Object来引用，在有些情况下不是很方便。在这些情况下，可以使用上下界来限制未知类型的范围。 如List\<? extends Number\>说明List中可能包含的元素类型是Number及其子类。而List\<? super Number\>则说明List中包含的是Number及其父类。当引入了上界之后，在使用类型的时候就可以使用上界类中定义的方法。比如访问 List\<? extends Number\>的时候，就可以使用Number类的intValue等方法。
