----- Original Message -----
> From: Ivan Maidanski <[email protected]>
>
> 2011-07-20 Ivan Maidanski <[email protected]>
>
> * 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 <[email protected]>
>
> + * 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 <[email protected]>
> +
> * 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