----- Original Message ----- > 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? >
Cleaned up the Changelog and pushed. -- Andrew :) Free Java Software Engineer Red Hat, Inc. (http://www.redhat.com) PGP Key: 248BDC07 (https://keys.indymedia.org/) Fingerprint = EC5A 1F5E C0AD 1D15 8F1F 8F91 3B96 A578 248B DC07