本帖最后由 李辉 于 2013-3-26 06:51 编辑
一两句话讲不清楚,我说一下要点
1.类型参数是不支持向上转型的,比如List<Fruit> list=new ArrayList<Apple>() 是不行的,即使Apple是Fruit的子类。理解这一点很重要,因为这正是java提供通配符‘?’的原因。
2.理解第一条之后,要理解为什么java要提供通配符。比如eat()方法要接受 ArrayList<Apple>参数 或者 ArrayList<Orange>参数 或者 ArrayList<Fruit>参数,如果没有通配符机制,那就得重载三次。
3.指定上下限是为了在使用通配符的时候更安全。比如eat方法定义时规定参数类型为ArrayList<?>,那么我们就可以给eat方法传递ArrayList<Car>类型的参数,这在编译时期是没有问题的!因为语法本身没错,只是我们不能吃了小汽车!运行的时候才会出错。如果指定参数类型的上限Fruit,就可以在编译器检查出这个错误。指定下限的一个很好的例子就是比较器。
如果你理解了我上面写的三条,那你问的问题就迎刃而解。我在此就不解释了。 |