我一直在使用java中的addAll方法。但它让我感到奇怪
public void addAll(List<T extends Person> persons)
和public void addAll(List<Person> persons)
答案 0 :(得分:3)
如果您询问声明,那么区别在于addAll(List<T extends Person> persons)
允许使用仅包含Person子类的列表进行调用。虽然addAll(List<Person> persons)
不接受此类参数。由于List<SubclassOfPerson>
无法分配到List<Parson>
这样:
class Child extends Person {};
List<Child> children = .....
调用addAll(children)
是有意义的,因为任何子节点都是Person,但如果addAll被声明为addAll(LIst<Person> persons)
,编译器就会抗议。
答案 1 :(得分:0)
这两个方法调用最终会做同样的事情:将list参数中的每个元素添加到调用该方法的列表中。编译器通过稍微不同的路径处理代码的事实并不意味着最终执行的内容也不会影响列表的最终内容。
你有更具体的问题吗?
答案 2 :(得分:0)
如果你想了解它,你必须经历这个: http://docs.oracle.com/javase/tutorial/java/generics/
但是为了回答你,区别在于,当你写
时public void addAll(List<T extends Person> persons)
然后,如果您有addAll(List<Worker> workers)
,则可以使用class Worker extends Person
调用此方法。但是你不能用第二个声明做到这一点。