Cowardly of you to not put some form of toArray() in AnyCollection :)

I still think the logical signatures here would be:
    E[] toArray()
    <U super E> toArray(IntFunction<U[]> generator)

These conflict with their counterparts in Collection, but in exactly the same way as contains/remove do.


Separately, one might wonder (and you should wonder) "What does ? extends/super T mean when T is an avar?"

The answer is: another dependent type, namely:

   ? extends T  =  if (ref T)
                       then ? extends T
                       else T

This may look circular, but is not; we already have a definition of "? extends T" for a reference tvar. So when Foo<any T> is instantiated with a value type, then the variance on T folds away.

The point is: get used to this reasoning of "If T is a ref, then this, otherwise that." It's everywhere. (We can choose to be honest about it, or we can try and paper over it.)

On 12/24/2015 8:24 AM, Doug Lea wrote:

You might look at discussions so far as conceptually adding a
super-interface to Collection, but jamming all the methods
into Collection itself. It might be easier to pretend otherwise
for a while. If we had some really good names for these, we might
even prefer this way.

Here's sketch of Collection (Not yet for List and Map)

interface AnyCollection<E> {
    boolean isEmpty();
    boolean contains(E e); // not Object

    boolean add(E e);
    boolean remove(E e);   // not Object
    boolean removeIf(Predicate<? super E> filter);
    void clear();

    Iterator<E> iterator();
    Stream<E> stream();
    Stream<E> parallelStream();

    boolean addAll(AnyCollection<? extends E> c);
boolean containsAll(AnyCollection<? extends E> c); // not Collection<?> boolean removeAll(AnyCollection<? extends E> c); // not Collection<?> boolean retainAll(AnyCollection<? extends E> c); // not Collection<?>

    // to address other issues:
    long elementCount();   // not size()
    AnyCollection<E> adding(E e);
    AnyCollection<E> removing(E e);
}

interface Collection<E> extends AnyCollection<E> {
    int size();
    boolean contains(Object o); // contravariant arg
    boolean remove(Object o);   // contravariant arg

    Object[] toArray();
    <T> T[] toArray(T[] a);

    boolean equals(Object o);   // declare for sake of Collection spec
    int hashCode();             // declare for sake of Collection spec

    boolean containsAll(Collection<?> c);
    boolean removeAll(Collection<?> c);
    boolean retainAll(Collection<?> c);
}


Reply via email to