Hi Andrew, 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; } /** @@ -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) { Regards, Ivan Mon, 15 Oct 2012 06:09:57 -0400 (EDT) от Andrew Hughes <ahug...@redhat.com>: > > > > > > > ----- Original Message ----- > > From: Ivan Maidanski <iv...@mail.ru> > > > > 2011-07-20 Ivan Maidanski <iv...@mail.ru> > > > > * java/util/Collections.java: > > (emptySet(), EmptySet.iterator(), emptyList(), emptyMap(), > > EmptyMap.entrySet(), EmptyMap.keySet(), EmptyMap.values(), > > SingletonList.subList(int, int)): 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(), SingletonList.subList(int, int)): Add generic > > typing. > > (SynchronizedCollection.toArray(T[])): Rename T type to E (to > > suppress compiler warning about type hiding). > > --- > > ChangeLog | 15 +++++++++++++++ > > java/util/Collections.java | 33 +++++++++++++++++++-------------- > > 2 files changed, 34 insertions(+), 14 deletions(-) > > > > diff --git a/ChangeLog b/ChangeLog > > index c0d84cd..5690754 100644 > > --- a/ChangeLog > > +++ b/ChangeLog > > @@ -1,5 +1,20 @@ > > 2011-07-20 Ivan Maidanski <iv...@mail.ru> > > > > + * java/util/Collections.java: > > + (emptySet(), EmptySet.iterator(), emptyList(), emptyMap(), > > + EmptyMap.entrySet(), EmptyMap.keySet(), EmptyMap.values(), > > + SingletonList.subList(int, int)): 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(), SingletonList.subList(int, int)): Add generic > > + typing. > > + (SynchronizedCollection.toArray(T[])): Rename T type to E (to > > + suppress compiler warning about type hiding). > > + > > +2011-07-20 Ivan Maidanski <iv...@mail.ru> > > + > > * native/jni/java-util/java_util_VMTimeZone.c: > > Include jcl.h file. > > (Java_java_util_VMTimeZone_getSystemTimeZoneId): Throw > > diff --git a/java/util/Collections.java b/java/util/Collections.java > > index 828c6ec..e7e7056 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; > > } > > This is ugly, but it seems to be the right thing according to the Javadoc: > > "Implementation note: Implementations of this method need not create a separate Set object for each call. Using this method is likely to have comparable cost to using the like-named field. (Unlike this method, the field does not provide type safety." > > > > > /** > > @@ -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; > > } > > > > /** > > @@ -1851,10 +1855,11 @@ public class Collections > > * @throws IndexOutOfBoundsException if either bound is greater > > * than 1. > > */ > > + @SuppressWarnings("unchecked") > > public List<T> subList(int from, int to) > > { > > if (from == to && (to == 0 || to == 1)) > > - return EMPTY_LIST; > > + return (List<T>) EMPTY_LIST; > > if (from == 0 && to == 1) > > return this; > > if (from > to) > > This seems wrong. The scope of unchecked is far too wide. Couldn't emptyList() > be used? > > > @@ -2480,7 +2485,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) > > { > > -- > > 1.7.7.6 > > > > > > > > -- > 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 > > >