ArrayList.removeAll()/retainAll()

Benedict Elliott Smith belliottsmith at datastax.com
Tue Feb 4 17:00:43 UTC 2014


Hi,

I notice this (or a related issue) has been mentioned
before<http://mail.openjdk.java.net/pipermail/core-libs-dev/2013-June/017663.html>on
this list, but I'm not convinced the correct resolution was reached.
We
are seeing this problem thrown by antlr, but rather than a bug in antlr, as
surmised on the previous exchange, it looks to me that ArrayList is
imposing a new constraint that is neither declared by itself nor
Collection, and is unnecessary. ArrayList happily supports null elements,
so requiring that the provided collection has no null elements is surely a
bug?

I've pasted the two declarations below for ease of reference. Neither
javadocs describe the constraint that is imposed.

ArrayList:
    /**
     * Removes from this list all of its elements that are contained in the
     * specified collection.
     *
     * @param c collection containing elements to be removed from this list
     * @return {@code true} if this list changed as a result of the call
     * @throws ClassCastException if the class of an element of this list
     *         is incompatible with the specified collection
     * (<a href="Collection.html#optional-restrictions">optional</a>)
     * @throws NullPointerException if this list contains a null element
and the
     *         specified collection does not permit null elements
     * (<a href="Collection.html#optional-restrictions">optional</a>),
     *         or if the specified collection is null
     * @see Collection#contains(Object)
     */
    public boolean removeAll(Collection<?> c) {
        Objects.requireNonNull(c);
        return batchRemove(c, false);
    }

Collection:
    /**
     * Removes all of this collection's elements that are also contained in
the
     * specified collection (optional operation).  After this call returns,
     * this collection will contain no elements in common with the specified
     * collection.
     *
     * @param c collection containing elements to be removed from this
collection
     * @return <tt>true</tt> if this collection changed as a result of the
     *         call
     * @throws UnsupportedOperationException if the <tt>removeAll</tt>
method
     *         is not supported by this collection
     * @throws ClassCastException if the types of one or more elements
     *         in this collection are incompatible with the specified
     *         collection
     *         (<a href="#optional-restrictions">optional</a>)
     * @throws NullPointerException if this collection contains one or more
     *         null elements and the specified collection does not support
     *         null elements
     *         (<a href="#optional-restrictions">optional</a>),
     *         or if the specified collection is null
     * @see #remove(Object)
     * @see #contains(Object)
     */
    boolean removeAll(Collection<?> c);



More information about the core-libs-dev mailing list