为何List接口中仅add(int index, E element)返回void,其余add方法返回boolean?
为什么List接口中
add(int index, E element)返回void,其他add方法却返回boolean? 核心原因在于方法语义和接口契约的设计权衡:
先看继承自Collection的
add(E e):Collection接口定义该方法返回boolean,是因为部分实现类(比如Set)不允许重复元素,添加重复元素时集合不会被修改,返回false来标识这一情况。List虽然允许重复元素,add(E e)几乎总是返回true,但必须遵守Collection的接口契约,因此保留了boolean返回值。而
add(int index, E element)是List独有的插入方法,它的语义是在指定位置插入单个元素。对于任何合法的List实现来说,这个操作一定会修改集合——不管元素是否重复,插入后List的长度必然+1,集合内容肯定发生变化。既然返回boolean没有实际意义(永远是true),设计时就干脆让它返回void,避免开发者误以为这个操作可能失败或不修改集合。至于addAll方法,不管是继承自Collection的
addAll(Collection<? extends E> c)还是List独有的addAll(int index, Collection<? extends E> c),它们的语义都是批量添加元素。如果传入的集合是空的,操作不会修改原List,此时返回false是合理的;如果有元素被添加,则返回true。为了保持接口设计的一致性,两个addAll方法统一返回boolean,哪怕后者是List独有的方法。
内容的提问来源于stack exchange,提问作者BJagger
相关产品推荐
相关产品推荐

