You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ba...@apache.org on 2009/09/15 07:56:06 UTC

svn commit: r815078 - /commons/proper/collections/trunk/src/java/org/apache/commons/collections/map/LazyMap.java

Author: bayard
Date: Tue Sep 15 05:56:06 2009
New Revision: 815078

URL: http://svn.apache.org/viewvc?rev=815078&view=rev
Log:
Merging from -r468106:814127 of collections_jdk5_branch - namely where this code was generified; mostly in r738956.

Also see the following revisions:

    ------------------------------------------------------------------------
    r571381 | skestle | 2007-08-30 22:13:56 -0700 (Thu, 30 Aug 2007) | 1 line
    
    Generified LazyMap
    ------------------------------------------------------------------------

Modified:
    commons/proper/collections/trunk/src/java/org/apache/commons/collections/map/LazyMap.java

Modified: commons/proper/collections/trunk/src/java/org/apache/commons/collections/map/LazyMap.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/java/org/apache/commons/collections/map/LazyMap.java?rev=815078&r1=815077&r2=815078&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/java/org/apache/commons/collections/map/LazyMap.java (original)
+++ commons/proper/collections/trunk/src/java/org/apache/commons/collections/map/LazyMap.java Tue Sep 15 05:56:06 2009
@@ -62,15 +62,13 @@
  * @author Stephen Colebourne
  * @author Paul Jack
  */
-public class LazyMap
-        extends AbstractMapDecorator
-        implements Map, Serializable {
+public class LazyMap<K, V> extends AbstractMapDecorator<K, V> implements Map<K, V>, Serializable {
 
     /** Serialization version */
     private static final long serialVersionUID = 7990956402564206740L;
 
     /** The factory to use to construct elements */
-    protected final Transformer factory;
+    protected final Transformer<? super K, ? extends V> factory;
 
     /**
      * Factory method to create a lazily instantiated map.
@@ -78,9 +76,11 @@
      * @param map  the map to decorate, must not be null
      * @param factory  the factory to use, must not be null
      * @throws IllegalArgumentException if map or factory is null
+     * @deprecated use {@link #getLazyMap(Map, Factory)} instead.
      */
-    public static Map decorate(Map map, Factory factory) {
-        return new LazyMap(map, factory);
+    @Deprecated
+    public static <K,V> Map<K,V> decorate(Map<K,V> map, Factory<? extends V> factory) {
+        return getLazyMap(map, factory);
     }
 
     /**
@@ -90,8 +90,32 @@
      * @param factory  the factory to use, must not be null
      * @throws IllegalArgumentException if map or factory is null
      */
-    public static Map decorate(Map map, Transformer factory) {
-        return new LazyMap(map, factory);
+    public static <K, V> LazyMap<K, V> getLazyMap(Map<K, V> map, Factory< ? extends V> factory) {
+        return new LazyMap<K,V>(map, factory);
+    }
+
+    /**
+     * Factory method to create a lazily instantiated map.
+     * 
+     * @param map  the map to decorate, must not be null
+     * @param factory  the factory to use, must not be null
+     * @throws IllegalArgumentException if map or factory is null
+     * @deprecated use {@link #getLazyMap(Map, Transformer)} instead.
+     */
+    @Deprecated
+    public static <K,V> Map<K,V> decorate(Map<K,V> map, Transformer<? super K, ? extends V> factory) {
+        return getLazyMap(map, factory);
+    }
+
+    /**
+     * Factory method to create a lazily instantiated map.
+     * 
+     * @param map  the map to decorate, must not be null
+     * @param factory  the factory to use, must not be null
+     * @throws IllegalArgumentException if map or factory is null
+     */
+    public static <V, K> LazyMap<K, V> getLazyMap(Map<K, V> map, Transformer<? super K, ? extends V> factory) {
+        return new LazyMap<K,V>(map, factory);
     }
 
     //-----------------------------------------------------------------------
@@ -102,7 +126,7 @@
      * @param factory  the factory to use, must not be null
      * @throws IllegalArgumentException if map or factory is null
      */
-    protected LazyMap(Map map, Factory factory) {
+    protected LazyMap(Map<K,V> map, Factory<? extends V> factory) {
         super(map);
         if (factory == null) {
             throw new IllegalArgumentException("Factory must not be null");
@@ -117,7 +141,7 @@
      * @param factory  the factory to use, must not be null
      * @throws IllegalArgumentException if map or factory is null
      */
-    protected LazyMap(Map map, Transformer factory) {
+    protected LazyMap(Map<K,V> map, Transformer<? super K, ? extends V> factory) {
         super(map);
         if (factory == null) {
             throw new IllegalArgumentException("Factory must not be null");
@@ -146,22 +170,36 @@
      * @throws ClassNotFoundException
      * @since Commons Collections 3.1
      */
+    @SuppressWarnings("unchecked")
     private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
         in.defaultReadObject();
         map = (Map) in.readObject();
     }
 
     //-----------------------------------------------------------------------
-    public Object get(Object key) {
+    @Override
+    public V get(Object key) {
         // create value for key if key is not currently in the map
         if (map.containsKey(key) == false) {
-            Object value = factory.transform(key);
-            map.put(key, value);
+            K castKey = cast(key);
+            V value = factory.transform(castKey);
+            map.put(castKey, value);
             return value;
         }
         return map.get(key);
     }
 
+    /**
+     * Method just to cast {@link Object}s to K where necessary.  This is done to ensure that the SuppressWarnings does not 
+     * cover other stuff that it shouldn't
+     * @param key .
+     * @return the cast key.
+     */
+    @SuppressWarnings("unchecked")
+    private K cast(Object key) {
+        return (K) key;
+    }
+
     // no need to wrap keySet, entrySet or values as they are views of
     // existing map entries - you can't do a map-style get on them.
 }