On Tue, Oct 16, 2012 at 9:49 PM, Ivan Maidanski <iv...@mail.ru> wrote: > You're right about emptyList() invocation from subList. > Thanks. > > Updated (and rebased) commit: > https://github.com/ivmai/classpath/commit/ef3af4f38970f7cea3d5b5a7d98a617f7b23da4e > (branch: https://github.com/ivmai/classpath/tree/ivmai4review-v3) > > diff --git a/ChangeLog b/ChangeLog > index f78f393..5805463 100644 > --- a/ChangeLog > +++ b/ChangeLog > @@ -1,3 +1,19 @@ > +2012-10-16 Ivan Maidanski <iv...@mail.ru> > + > + * java/util/Collections.java: > + (emptySet(), EmptySet.iterator(), emptyList(), emptyMap(), > + EmptyMap.entrySet(), EmptyMap.keySet(), EmptyMap.values()): Suppress > + "unchecked" warnings. > + (emptySet(), emptyList(), emptyMap()): Don't create new instance (use > + the corresponding immutable container instance); remove FIXME. > + (EmptySet.equals(Object), EmptyList.equals(Object), > + EmptyMap.entrySet(), EmptyMap.equals(Object), EmptyMap.keySet(), > + EmptyMap.values()): Add generic typing. > + (SingletonList.subList(int, int)): Use emptyList() instead of > + EMPTY_LIST (to eliminate "unchecked" warning). > + (SynchronizedCollection.toArray(T[])): Rename T type to E (to > + suppress compiler warning about type hiding). > + > 2012-10-15 Andrew John Hughes <gnu_and...@member.fsf.org> > > * configure.ac: Set to 0.99.1pre, as > diff --git a/java/util/Collections.java b/java/util/Collections.java > index 828c6ec..b970dd8 100644 > --- a/java/util/Collections.java > +++ b/java/util/Collections.java > @@ -120,10 +120,10 @@ public class Collections > * @return an empty parameterized set. > * @since 1.5 > */ > + @SuppressWarnings("unchecked") > public static final <T> Set<T> emptySet() > { > - /* FIXME: Could this be optimized? */ > - return new EmptySet<T>(); > + return (Set<T>) EMPTY_SET; > } > > /**> Hi Andrew, >
> @@ -161,6 +161,7 @@ public class Collections > * @return A non-iterating iterator. > */ > // This is really cheating! I think it's perfectly valid, though. > + @SuppressWarnings("unchecked") > public Iterator<T> iterator() > { > return (Iterator<T>) EMPTY_LIST.iterator(); > @@ -196,7 +197,7 @@ public class Collections > */ > public boolean equals(Object o) > { > - return o instanceof Set && ((Set) o).isEmpty(); > + return o instanceof Set<?> && ((Set<?>) o).isEmpty(); > } > > /** > @@ -288,10 +289,10 @@ public class Collections > * @return an empty parameterized list. > * @since 1.5 > */ > + @SuppressWarnings("unchecked") > public static final <T> List<T> emptyList() > { > - /* FIXME: Could this be optimized? */ > - return new EmptyList<T>(); > + return (List<T>) EMPTY_LIST; > } > > /** > @@ -369,7 +370,7 @@ public class Collections > */ > public boolean equals(Object o) > { > - return o instanceof List && ((List) o).isEmpty(); > + return o instanceof List<?> && ((List<?>) o).isEmpty(); > } > > /** > @@ -480,10 +481,10 @@ public class Collections > * @return an empty parameterized map. > * @since 1.5 > */ > + @SuppressWarnings("unchecked") > public static final <K,V> Map<K,V> emptyMap() > { > - /* FIXME: Could this be optimized? */ > - return new EmptyMap<K,V>(); > + return (Map<K,V>) EMPTY_MAP; > } > > /** > @@ -511,9 +512,10 @@ public class Collections > * There are no entries. > * @return The empty set. > */ > + @SuppressWarnings("unchecked") > public Set<Map.Entry<K, V>> entrySet() > { > - return EMPTY_SET; > + return (Set<Map.Entry<K, V>>) EMPTY_SET; > } > > // The remaining methods are optional, but provide a performance > @@ -546,7 +548,7 @@ public class Collections > */ > public boolean equals(Object o) > { > - return o instanceof Map && ((Map) o).isEmpty(); > + return o instanceof Map<?,?> && ((Map<?,?>) o).isEmpty(); > } > > /** > @@ -572,9 +574,10 @@ public class Collections > * No entries. > * @return The empty set. > */ > + @SuppressWarnings("unchecked") > public Set<K> keySet() > { > - return EMPTY_SET; > + return (Set<K>) EMPTY_SET; > } > > /** > @@ -601,9 +604,10 @@ public class Collections > * Collection, will work. Besides, that's what the JDK uses! > * @return The empty set. > */ > + @SuppressWarnings("unchecked") > public Collection<V> values() > { > - return EMPTY_SET; > + return (Collection<V>) EMPTY_SET; > } > > /** > @@ -1854,7 +1858,7 @@ public class Collections > public List<T> subList(int from, int to) > { > if (from == to && (to == 0 || to == 1)) > - return EMPTY_LIST; > + return emptyList(); > if (from == 0 && to == 1) > return this; > if (from > to) > @@ -2480,7 +2484,7 @@ public class Collections > * @throws ArrayStoreException if the type of any element of the > * collection is not a subtype of the element type of a. > */ > - public <T> T[] toArray(T[] a) > + public <E> E[] toArray(E[] a) > { > synchronized (mutex) > { > > Andrew, can you take a look at this, please?