http://git-wip-us.apache.org/repos/asf/commons-collections/blob/884baf0d/src/java/org/apache/commons/collections/keyvalue/TiedMapEntry.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/commons/collections/keyvalue/TiedMapEntry.java 
b/src/java/org/apache/commons/collections/keyvalue/TiedMapEntry.java
index a793824..46d2083 100644
--- a/src/java/org/apache/commons/collections/keyvalue/TiedMapEntry.java
+++ b/src/java/org/apache/commons/collections/keyvalue/TiedMapEntry.java
@@ -32,15 +32,16 @@ import org.apache.commons.collections.KeyValue;
  * 
  * @author Stephen Colebourne
  */
-public class TiedMapEntry implements Map.Entry, KeyValue, Serializable {
+public class TiedMapEntry<K, V> implements Map.Entry<K, V>, KeyValue<K, V>, 
Serializable {
 
     /** Serialization version */    
     private static final long serialVersionUID = -8453869361373831205L;
 
     /** The map underlying the entry/iterator */    
-    private final Map map;
+    private final Map<K, V> map;
+
     /** The key */
-    private final Object key;
+    private final K key;
 
     /**
      * Constructs a new entry with the given Map and key.
@@ -48,7 +49,7 @@ public class TiedMapEntry implements Map.Entry, KeyValue, 
Serializable {
      * @param map  the map
      * @param key  the key
      */
-    public TiedMapEntry(Map map, Object key) {
+    public TiedMapEntry(Map<K, V> map, K key) {
         super();
         this.map = map;
         this.key = key;
@@ -61,7 +62,7 @@ public class TiedMapEntry implements Map.Entry, KeyValue, 
Serializable {
      * 
      * @return the key
      */
-    public Object getKey() {
+    public K getKey() {
         return key;
     }
 
@@ -70,7 +71,7 @@ public class TiedMapEntry implements Map.Entry, KeyValue, 
Serializable {
      * 
      * @return the value
      */
-    public Object getValue() {
+    public V getValue() {
         return map.get(key);
     }
 
@@ -81,7 +82,7 @@ public class TiedMapEntry implements Map.Entry, KeyValue, 
Serializable {
      * @return the old value
      * @throws IllegalArgumentException if the value is set to this map entry
      */
-    public Object setValue(Object value) {
+    public V setValue(V value) {
         if (value == this) {
             throw new IllegalArgumentException("Cannot set value to this map 
entry");
         }
@@ -96,6 +97,7 @@ public class TiedMapEntry implements Map.Entry, KeyValue, 
Serializable {
      * @param obj  the object to compare to
      * @return true if equal key and value
      */
+    @SuppressWarnings("unchecked")
     public boolean equals(Object obj) {
         if (obj == this) {
             return true;

http://git-wip-us.apache.org/repos/asf/commons-collections/blob/884baf0d/src/java/org/apache/commons/collections/keyvalue/UnmodifiableMapEntry.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/commons/collections/keyvalue/UnmodifiableMapEntry.java 
b/src/java/org/apache/commons/collections/keyvalue/UnmodifiableMapEntry.java
index 047967e..c316bbc 100644
--- a/src/java/org/apache/commons/collections/keyvalue/UnmodifiableMapEntry.java
+++ b/src/java/org/apache/commons/collections/keyvalue/UnmodifiableMapEntry.java
@@ -30,7 +30,7 @@ import org.apache.commons.collections.Unmodifiable;
  * 
  * @author Stephen Colebourne
  */
-public final class UnmodifiableMapEntry extends AbstractMapEntry implements 
Unmodifiable {
+public final class UnmodifiableMapEntry<K, V> extends AbstractMapEntry<K, V> 
implements Unmodifiable {
 
     /**
      * Constructs a new entry with the specified key and given value.
@@ -38,7 +38,7 @@ public final class UnmodifiableMapEntry extends 
AbstractMapEntry implements Unmo
      * @param key  the key for the entry, may be null
      * @param value  the value for the entry, may be null
      */
-    public UnmodifiableMapEntry(final Object key, final Object value) {
+    public UnmodifiableMapEntry(final K key, final V value) {
         super(key, value);
     }
 
@@ -48,7 +48,7 @@ public final class UnmodifiableMapEntry extends 
AbstractMapEntry implements Unmo
      * @param pair  the pair to copy, must not be null
      * @throws NullPointerException if the entry is null
      */
-    public UnmodifiableMapEntry(final KeyValue pair) {
+    public UnmodifiableMapEntry(final KeyValue<K, V> pair) {
         super(pair.getKey(), pair.getValue());
     }
 
@@ -58,7 +58,7 @@ public final class UnmodifiableMapEntry extends 
AbstractMapEntry implements Unmo
      * @param entry  the entry to copy, must not be null
      * @throws NullPointerException if the entry is null
      */
-    public UnmodifiableMapEntry(final Map.Entry entry) {
+    public UnmodifiableMapEntry(final Map.Entry<K, V> entry) {
         super(entry.getKey(), entry.getValue());
     }
 
@@ -69,7 +69,7 @@ public final class UnmodifiableMapEntry extends 
AbstractMapEntry implements Unmo
      * @return the previous value
      * @throws UnsupportedOperationException always
      */
-    public Object setValue(Object value) {
+    public V setValue(V value) {
         throw new UnsupportedOperationException("setValue() is not supported");
     }
 

http://git-wip-us.apache.org/repos/asf/commons-collections/blob/884baf0d/src/java/org/apache/commons/collections/list/AbstractLinkedList.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/commons/collections/list/AbstractLinkedList.java 
b/src/java/org/apache/commons/collections/list/AbstractLinkedList.java
index 04c7357..738871e 100644
--- a/src/java/org/apache/commons/collections/list/AbstractLinkedList.java
+++ b/src/java/org/apache/commons/collections/list/AbstractLinkedList.java
@@ -5,9 +5,9 @@
  * The ASF licenses this file to You under the Apache License, Version 2.0
  * (the "License"); you may not use this file except in compliance with
  * the License.  You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -37,7 +37,7 @@ import org.apache.commons.collections.OrderedIterator;
  * Overridable methods are provided to change the storage node and to change 
how
  * nodes are added to and removed. Hopefully, all you need for unusual 
subclasses
  * is here.
- * 
+ *
  * @since Commons Collections 3.0
  * @version $Revision$ $Date$
  *
@@ -45,7 +45,7 @@ import org.apache.commons.collections.OrderedIterator;
  * @author Phil Steitz
  * @author Stephen Colebourne
  */
-public abstract class AbstractLinkedList implements List {
+public abstract class AbstractLinkedList<E> implements List<E> {
 
     /*
      * Implementation notes:
@@ -63,9 +63,11 @@ public abstract class AbstractLinkedList implements List {
      * hold a value. The value of <code>next</code> is the first item in the
      * list. The value of of <code>previous</code> is the last item in the 
list.
      */
-    protected transient Node header;
+    protected transient Node<E> header;
+
     /** The size of the list */
     protected transient int size;
+
     /** Modification count for iterators */
     protected transient int modCount;
 
@@ -81,10 +83,10 @@ public abstract class AbstractLinkedList implements List {
 
     /**
      * Constructs a list copying data from the specified collection.
-     * 
+     *
      * @param coll  the collection to copy
      */
-    protected AbstractLinkedList(Collection coll) {
+    protected AbstractLinkedList(Collection<? extends E> coll) {
         super();
         init();
         addAll(coll);
@@ -109,28 +111,28 @@ public abstract class AbstractLinkedList implements List {
         return (size() == 0);
     }
 
-    public Object get(int index) {
-        Node node = getNode(index, false);
+    public E get(int index) {
+        Node<E> node = getNode(index, false);
         return node.getValue();
     }
 
     //-----------------------------------------------------------------------
-    public Iterator iterator() {
+    public Iterator<E> iterator() {
         return listIterator();
     }
 
-    public ListIterator listIterator() {
-        return new LinkedListIterator(this, 0);
+    public ListIterator<E> listIterator() {
+        return new LinkedListIterator<E>(this, 0);
     }
 
-    public ListIterator listIterator(int fromIndex) {
-        return new LinkedListIterator(this, fromIndex);
+    public ListIterator<E> listIterator(int fromIndex) {
+        return new LinkedListIterator<E>(this, fromIndex);
     }
 
     //-----------------------------------------------------------------------
     public int indexOf(Object value) {
         int i = 0;
-        for (Node node = header.next; node != header; node = node.next) {
+        for (Node<E> node = header.next; node != header; node = node.next) {
             if (isEqualValue(node.getValue(), value)) {
                 return i;
             }
@@ -141,7 +143,7 @@ public abstract class AbstractLinkedList implements List {
 
     public int lastIndexOf(Object value) {
         int i = size - 1;
-        for (Node node = header.previous; node != header; node = 
node.previous) {
+        for (Node<E> node = header.previous; node != header; node = 
node.previous) {
             if (isEqualValue(node.getValue(), value)) {
                 return i;
             }
@@ -154,31 +156,31 @@ public abstract class AbstractLinkedList implements List {
         return indexOf(value) != -1;
     }
 
-    public boolean containsAll(Collection coll) {
-        Iterator it = coll.iterator();
-        while (it.hasNext()) {
-            if (contains(it.next()) == false) {
+    public boolean containsAll(Collection<?> coll) {
+        for (Object o : coll) {
+            if (!contains(o)) {
                 return false;
             }
         }
         return true;
     }
-    
+
     //-----------------------------------------------------------------------
     public Object[] toArray() {
         return toArray(new Object[size]);
     }
 
-    public Object[] toArray(Object[] array) {
+    @SuppressWarnings("unchecked")
+    public <T> T[] toArray(T[] array) {
         // Extend the array if needed
         if (array.length < size) {
             Class componentType = array.getClass().getComponentType();
-            array = (Object[]) Array.newInstance(componentType, size);
+            array = (T[]) Array.newInstance(componentType, size);
         }
         // Copy the values into the array
         int i = 0;
-        for (Node node = header.next; node != header; node = node.next, i++) {
-            array[i] = node.getValue();
+        for (Node<E> node = header.next; node != header; node = node.next, 
i++) {
+            array[i] = (T) node.getValue();
         }
         // Set the value after the last value to null
         if (array.length > size) {
@@ -189,49 +191,48 @@ public abstract class AbstractLinkedList implements List {
 
     /**
      * Gets a sublist of the main list.
-     * 
+     *
      * @param fromIndexInclusive  the index to start from
      * @param toIndexExclusive  the index to end at
      * @return the new sublist
      */
-    public List subList(int fromIndexInclusive, int toIndexExclusive) {
-        return new LinkedSubList(this, fromIndexInclusive, toIndexExclusive);
+    public List<E> subList(int fromIndexInclusive, int toIndexExclusive) {
+        return new LinkedSubList<E>(this, fromIndexInclusive, 
toIndexExclusive);
     }
-    
+
     //-----------------------------------------------------------------------
-    public boolean add(Object value) {
+    public boolean add(E value) {
         addLast(value);
         return true;
     }
-    
-    public void add(int index, Object value) {
-        Node node = getNode(index, true);
+
+    public void add(int index, E value) {
+        Node<E> node = getNode(index, true);
         addNodeBefore(node, value);
     }
-    
-    public boolean addAll(Collection coll) {
+
+    public boolean addAll(Collection<? extends E> coll) {
         return addAll(size, coll);
     }
 
-    public boolean addAll(int index, Collection coll) {
-        Node node = getNode(index, true);
-        for (Iterator itr = coll.iterator(); itr.hasNext();) {
-            Object value = itr.next();
-            addNodeBefore(node, value);
+    public boolean addAll(int index, Collection<? extends E> coll) {
+        Node<E> node = getNode(index, true);
+        for (E e : coll) {
+            addNodeBefore(node, e);
         }
         return true;
     }
 
     //-----------------------------------------------------------------------
-    public Object remove(int index) {
-        Node node = getNode(index, false);
-        Object oldValue = node.getValue();
+    public E remove(int index) {
+        Node<E> node = getNode(index, false);
+        E oldValue = node.getValue();
         removeNode(node);
         return oldValue;
     }
 
     public boolean remove(Object value) {
-        for (Node node = header.next; node != header; node = node.next) {
+        for (Node<E> node = header.next; node != header; node = node.next) {
             if (isEqualValue(node.getValue(), value)) {
                 removeNode(node);
                 return true;
@@ -240,9 +241,9 @@ public abstract class AbstractLinkedList implements List {
         return false;
     }
 
-    public boolean removeAll(Collection coll) {
+    public boolean removeAll(Collection<?> coll) {
         boolean modified = false;
-        Iterator it = iterator();
+        Iterator<E> it = iterator();
         while (it.hasNext()) {
             if (coll.contains(it.next())) {
                 it.remove();
@@ -253,9 +254,9 @@ public abstract class AbstractLinkedList implements List {
     }
 
     //-----------------------------------------------------------------------
-    public boolean retainAll(Collection coll) {
+    public boolean retainAll(Collection<?> coll) {
         boolean modified = false;
-        Iterator it = iterator();
+        Iterator<E> it = iterator();
         while (it.hasNext()) {
             if (coll.contains(it.next()) == false) {
                 it.remove();
@@ -265,9 +266,9 @@ public abstract class AbstractLinkedList implements List {
         return modified;
     }
 
-    public Object set(int index, Object value) {
-        Node node = getNode(index, false);
-        Object oldValue = node.getValue();
+    public E set(int index, E value) {
+        Node<E> node = getNode(index, false);
+        E oldValue = node.getValue();
         updateNode(node, value);
         return oldValue;
     }
@@ -275,55 +276,56 @@ public abstract class AbstractLinkedList implements List {
     public void clear() {
         removeAllNodes();
     }
-    
+
     //-----------------------------------------------------------------------
-    public Object getFirst() {
-        Node node = header.next;
+    public E getFirst() {
+        Node<E> node = header.next;
         if (node == header) {
             throw new NoSuchElementException();
         }
         return node.getValue();
     }
 
-    public Object getLast() {
-        Node node = header.previous;
+    public E getLast() {
+        Node<E> node = header.previous;
         if (node == header) {
             throw new NoSuchElementException();
         }
         return node.getValue();
     }
 
-    public boolean addFirst(Object o) {
+    public boolean addFirst(E o) {
         addNodeAfter(header, o);
         return true;
     }
 
-    public boolean addLast(Object o) {
+    public boolean addLast(E o) {
         addNodeBefore(header, o);
         return true;
     }
 
-    public Object removeFirst() {
-        Node node = header.next;
+    public E removeFirst() {
+        Node<E> node = header.next;
         if (node == header) {
             throw new NoSuchElementException();
         }
-        Object oldValue = node.getValue();
+        E oldValue = node.getValue();
         removeNode(node);
         return oldValue;
     }
 
-    public Object removeLast() {
-        Node node = header.previous;
+    public E removeLast() {
+        Node<E> node = header.previous;
         if (node == header) {
             throw new NoSuchElementException();
         }
-        Object oldValue = node.getValue();
+        E oldValue = node.getValue();
         removeNode(node);
         return oldValue;
     }
 
     //-----------------------------------------------------------------------
+    @SuppressWarnings("unchecked")
     public boolean equals(Object obj) {
         if (obj == this) {
             return true;
@@ -348,10 +350,8 @@ public abstract class AbstractLinkedList implements List {
 
     public int hashCode() {
         int hashCode = 1;
-        Iterator it = iterator();
-        while (it.hasNext()) {
-            Object obj = it.next();
-            hashCode = 31 * hashCode + (obj == null ? 0 : obj.hashCode());
+        for (E e : this) {
+            hashCode = 31 * hashCode + (e == null ? 0 : e.hashCode());
         }
         return hashCode;
     }
@@ -363,7 +363,7 @@ public abstract class AbstractLinkedList implements List {
         StringBuffer buf = new StringBuffer(16 * size());
         buf.append("[");
 
-        Iterator it = iterator();
+        Iterator<E> it = iterator();
         boolean hasNext = it.hasNext();
         while (hasNext) {
             Object value = it.next();
@@ -382,7 +382,7 @@ public abstract class AbstractLinkedList implements List {
      * Compares two values for equals.
      * This implementation uses the equals method.
      * Subclasses can override this to match differently.
-     * 
+     *
      * @param value1  the first value to compare, may be null
      * @param value2  the second value to compare, may be null
      * @return true if equal
@@ -390,16 +390,16 @@ public abstract class AbstractLinkedList implements List {
     protected boolean isEqualValue(Object value1, Object value2) {
         return (value1 == value2 || (value1 == null ? false : 
value1.equals(value2)));
     }
-    
+
     /**
      * Updates the node with a new value.
      * This implementation sets the value on the node.
      * Subclasses can override this to record the change.
-     * 
+     *
      * @param node  node to update
      * @param value  new value of the node
      */
-    protected void updateNode(Node node, Object value) {
+    protected void updateNode(Node<E> node, E value) {
         node.setValue(value);
     }
 
@@ -407,26 +407,26 @@ public abstract class AbstractLinkedList implements List {
      * Creates a new node with previous, next and element all set to null.
      * This implementation creates a new empty Node.
      * Subclasses can override this to create a different class.
-     * 
+     *
      * @return  newly created node
      */
-    protected Node createHeaderNode() {
-        return new Node();
+    protected Node<E> createHeaderNode() {
+        return new Node<E>();
     }
 
     /**
      * Creates a new node with the specified properties.
      * This implementation creates a new Node with data.
      * Subclasses can override this to create a different class.
-     * 
+     *
      * @param value  value of the new node
      */
-    protected Node createNode(Object value) {
-        return new Node(value);
+    protected Node<E> createNode(E value) {
+        return new Node<E>(value);
     }
 
     /**
-     * Creates a new node with the specified object as its 
+     * Creates a new node with the specified object as its
      * <code>value</code> and inserts it before <code>node</code>.
      * <p>
      * This implementation uses {@link #createNode(Object)} and
@@ -436,24 +436,24 @@ public abstract class AbstractLinkedList implements List {
      * @param value  value of the newly added node
      * @throws NullPointerException if <code>node</code> is null
      */
-    protected void addNodeBefore(Node node, Object value) {
-        Node newNode = createNode(value);
+    protected void addNodeBefore(Node<E> node, E value) {
+        Node<E> newNode = createNode(value);
         addNode(newNode, node);
     }
 
     /**
-     * Creates a new node with the specified object as its 
+     * Creates a new node with the specified object as its
      * <code>value</code> and inserts it after <code>node</code>.
      * <p>
      * This implementation uses {@link #createNode(Object)} and
      * {@link #addNode(AbstractLinkedList.Node,AbstractLinkedList.Node)}.
-     * 
+     *
      * @param node  node to insert after
      * @param value  value of the newly added node
      * @throws NullPointerException if <code>node</code> is null
      */
-    protected void addNodeAfter(Node node, Object value) {
-        Node newNode = createNode(value);
+    protected void addNodeAfter(Node<E> node, E value) {
+        Node<E> newNode = createNode(value);
         addNode(newNode, node.next);
     }
 
@@ -464,7 +464,7 @@ public abstract class AbstractLinkedList implements List {
      * @param insertBeforeNode  node to insert before
      * @throws NullPointerException if either node is null
      */
-    protected void addNode(Node nodeToInsert, Node insertBeforeNode) {
+    protected void addNode(Node<E> nodeToInsert, Node<E> insertBeforeNode) {
         nodeToInsert.next = insertBeforeNode;
         nodeToInsert.previous = insertBeforeNode.previous;
         insertBeforeNode.previous.next = nodeToInsert;
@@ -479,7 +479,7 @@ public abstract class AbstractLinkedList implements List {
      * @param node  the node to remove
      * @throws NullPointerException if <code>node</code> is null
      */
-    protected void removeNode(Node node) {
+    protected void removeNode(Node<E> node) {
         node.previous.next = node.next;
         node.next.previous = node.previous;
         size--;
@@ -498,7 +498,7 @@ public abstract class AbstractLinkedList implements List {
 
     /**
      * Gets the node at a particular index.
-     * 
+     *
      * @param index  the index, starting from 0
      * @param endMarkerAllowed  whether or not the end marker can be returned 
if
      * startIndex is set to the list's size
@@ -506,7 +506,7 @@ public abstract class AbstractLinkedList implements List {
      * the size of the list and endMakerAllowed is false; or greater than the
      * size of the list
      */
-    protected Node getNode(int index, boolean endMarkerAllowed) throws 
IndexOutOfBoundsException {
+    protected Node<E> getNode(int index, boolean endMarkerAllowed) throws 
IndexOutOfBoundsException {
         // Check the index is within the bounds
         if (index < 0) {
             throw new IndexOutOfBoundsException("Couldn't get the node: " +
@@ -522,7 +522,7 @@ public abstract class AbstractLinkedList implements List {
                     "list (" + size + ").");
         }
         // Search the list and get the node
-        Node node;
+        Node<E> node;
         if (index < (size / 2)) {
             // Search forwards
             node = header.next;
@@ -542,21 +542,21 @@ public abstract class AbstractLinkedList implements List {
     //-----------------------------------------------------------------------
     /**
      * Creates an iterator for the sublist.
-     * 
+     *
      * @param subList  the sublist to get an iterator for
      */
-    protected Iterator createSubListIterator(LinkedSubList subList) {
+    protected Iterator<E> createSubListIterator(LinkedSubList<E> subList) {
         return createSubListListIterator(subList, 0);
     }
 
     /**
      * Creates a list iterator for the sublist.
-     * 
+     *
      * @param subList  the sublist to get an iterator for
      * @param fromIndex  the index to start from, relative to the sublist
      */
-    protected ListIterator createSubListListIterator(LinkedSubList subList, 
int fromIndex) {
-        return new LinkedSubListIterator(subList, fromIndex);
+    protected ListIterator<E> createSubListListIterator(LinkedSubList<E> 
subList, int fromIndex) {
+        return new LinkedSubListIterator<E>(subList, fromIndex);
     }
 
     //-----------------------------------------------------------------------
@@ -569,7 +569,7 @@ public abstract class AbstractLinkedList implements List {
     protected void doWriteObject(ObjectOutputStream outputStream) throws 
IOException {
         // Write the size so we know how many nodes to read back
         outputStream.writeInt(size());
-        for (Iterator itr = iterator(); itr.hasNext();) {
+        for (Iterator<E> itr = iterator(); itr.hasNext();) {
             outputStream.writeObject(itr.next());
         }
     }
@@ -580,11 +580,12 @@ public abstract class AbstractLinkedList implements List {
      * The first serializable subclass must call this method from
      * <code>readObject</code>.
      */
+    @SuppressWarnings("unchecked")
     protected void doReadObject(ObjectInputStream inputStream) throws 
IOException, ClassNotFoundException {
         init();
         int size = inputStream.readInt();
         for (int i = 0; i < size; i++) {
-            add(inputStream.readObject());
+            add((E) inputStream.readObject());
         }
     }
 
@@ -595,14 +596,14 @@ public abstract class AbstractLinkedList implements List {
      * From Commons Collections 3.1, all access to the <code>value</code> 
property
      * is via the methods on this class.
      */
-    protected static class Node {
+    protected static class Node<E> {
 
         /** A pointer to the node before this node */
-        protected Node previous;
+        protected Node<E> previous;
         /** A pointer to the node after this node */
-        protected Node next;
+        protected Node<E> next;
         /** The object contained within this node */
-        protected Object value;
+        protected E value;
 
         /**
          * Constructs a new header node.
@@ -615,85 +616,85 @@ public abstract class AbstractLinkedList implements List {
 
         /**
          * Constructs a new node.
-         * 
+         *
          * @param value  the value to store
          */
-        protected Node(Object value) {
+        protected Node(E value) {
             super();
             this.value = value;
         }
-        
+
         /**
          * Constructs a new node.
-         * 
+         *
          * @param previous  the previous node in the list
          * @param next  the next node in the list
          * @param value  the value to store
          */
-        protected Node(Node previous, Node next, Object value) {
+        protected Node(Node<E> previous, Node<E> next, E value) {
             super();
             this.previous = previous;
             this.next = next;
             this.value = value;
         }
-        
+
         /**
          * Gets the value of the node.
-         * 
+         *
          * @return the value
          * @since Commons Collections 3.1
          */
-        protected Object getValue() {
+        protected E getValue() {
             return value;
         }
-        
+
         /**
          * Sets the value of the node.
-         * 
+         *
          * @param value  the value
          * @since Commons Collections 3.1
          */
-        protected void setValue(Object value) {
+        protected void setValue(E value) {
             this.value = value;
         }
-        
+
         /**
          * Gets the previous node.
-         * 
+         *
          * @return the previous node
          * @since Commons Collections 3.1
          */
-        protected Node getPreviousNode() {
+        protected Node<E> getPreviousNode() {
             return previous;
         }
-        
+
         /**
          * Sets the previous node.
-         * 
+         *
          * @param previous  the previous node
          * @since Commons Collections 3.1
          */
-        protected void setPreviousNode(Node previous) {
+        protected void setPreviousNode(Node<E> previous) {
             this.previous = previous;
         }
-        
+
         /**
          * Gets the next node.
-         * 
+         *
          * @return the next node
          * @since Commons Collections 3.1
          */
-        protected Node getNextNode() {
+        protected Node<E> getNextNode() {
             return next;
         }
-        
+
         /**
          * Sets the next node.
-         * 
+         *
          * @param next  the next node
          * @since Commons Collections 3.1
          */
-        protected void setNextNode(Node next) {
+        protected void setNextNode(Node<E> next) {
             this.next = next;
         }
     }
@@ -702,16 +703,16 @@ public abstract class AbstractLinkedList implements List {
     /**
      * A list iterator over the linked list.
      */
-    protected static class LinkedListIterator implements ListIterator, 
OrderedIterator {
-        
+    protected static class LinkedListIterator<E> implements ListIterator<E>, 
OrderedIterator<E> {
+
         /** The parent list */
-        protected final AbstractLinkedList parent;
+        protected final AbstractLinkedList<E> parent;
 
         /**
          * The node that will be returned by {@link #next()}. If this is equal
          * to {@link AbstractLinkedList#header} then there are no more values 
to return.
          */
-        protected Node next;
+        protected Node<E> next;
 
         /**
          * The index of {@link #next}.
@@ -726,7 +727,7 @@ public abstract class AbstractLinkedList implements List {
          * Should be accessed through {@link #getLastNodeReturned()} to enforce
          * this behaviour.
          */
-        protected Node current;
+        protected Node<E> current;
 
         /**
          * The modification count that the list is expected to have. If the 
list
@@ -738,11 +739,11 @@ public abstract class AbstractLinkedList implements List {
 
         /**
          * Create a ListIterator for a list.
-         * 
+         *
          * @param parent  the parent list
          * @param fromIndex  the index to start at
          */
-        protected LinkedListIterator(AbstractLinkedList parent, int fromIndex) 
throws IndexOutOfBoundsException {
+        protected LinkedListIterator(AbstractLinkedList<E> parent, int 
fromIndex) throws IndexOutOfBoundsException {
             super();
             this.parent = parent;
             this.expectedModCount = parent.modCount;
@@ -753,7 +754,7 @@ public abstract class AbstractLinkedList implements List {
         /**
          * Checks the modification count of the list is the value that this
          * object expects.
-         * 
+         *
          * @throws ConcurrentModificationException If the list's modification
          * count isn't the value that was expected.
          */
@@ -765,12 +766,12 @@ public abstract class AbstractLinkedList implements List {
 
         /**
          * Gets the last node returned.
-         * 
+         *
          * @throws IllegalStateException If {@link #next()} or
          * {@link #previous()} haven't been called, or if the node has been 
removed
          * with {@link #remove()} or a new node added with {@link 
#add(Object)}.
          */
-        protected Node getLastNodeReturned() throws IllegalStateException {
+        protected Node<E> getLastNodeReturned() throws IllegalStateException {
             if (current == null) {
                 throw new IllegalStateException();
             }
@@ -781,12 +782,12 @@ public abstract class AbstractLinkedList implements List {
             return next != parent.header;
         }
 
-        public Object next() {
+        public E next() {
             checkModCount();
             if (!hasNext()) {
                 throw new NoSuchElementException("No element at index " + 
nextIndex + ".");
             }
-            Object value = next.getValue();
+            E value = next.getValue();
             current = next;
             next = next.next;
             nextIndex++;
@@ -797,13 +798,13 @@ public abstract class AbstractLinkedList implements List {
             return next.previous != parent.header;
         }
 
-        public Object previous() {
+        public E previous() {
             checkModCount();
             if (!hasPrevious()) {
                 throw new NoSuchElementException("Already at start of list.");
             }
             next = next.previous;
-            Object value = next.getValue();
+            E value = next.getValue();
             current = next;
             nextIndex--;
             return value;
@@ -833,12 +834,12 @@ public abstract class AbstractLinkedList implements List {
             expectedModCount++;
         }
 
-        public void set(Object obj) {
+        public void set(E obj) {
             checkModCount();
             getLastNodeReturned().setValue(obj);
         }
 
-        public void add(Object obj) {
+        public void add(E obj) {
             checkModCount();
             parent.addNodeBefore(next, obj);
             current = null;
@@ -852,12 +853,12 @@ public abstract class AbstractLinkedList implements List {
     /**
      * A list iterator over the linked sub list.
      */
-    protected static class LinkedSubListIterator extends LinkedListIterator {
-        
+    protected static class LinkedSubListIterator<E> extends 
LinkedListIterator<E> {
+
         /** The parent list */
-        protected final LinkedSubList sub;
-        
-        protected LinkedSubListIterator(LinkedSubList sub, int startIndex) {
+        protected final LinkedSubList<E> sub;
+
+        protected LinkedSubListIterator(LinkedSubList<E> sub, int startIndex) {
             super(sub.parent, startIndex + sub.offset);
             this.sub = sub;
         }
@@ -874,26 +875,26 @@ public abstract class AbstractLinkedList implements List {
             return (super.nextIndex() - sub.offset);
         }
 
-        public void add(Object obj) {
+        public void add(E obj) {
             super.add(obj);
             sub.expectedModCount = parent.modCount;
             sub.size++;
         }
-        
+
         public void remove() {
             super.remove();
             sub.expectedModCount = parent.modCount;
             sub.size--;
         }
     }
-    
+
     //-----------------------------------------------------------------------
     /**
      * The sublist implementation for AbstractLinkedList.
      */
-    protected static class LinkedSubList extends AbstractList {
+    protected static class LinkedSubList<E> extends AbstractList<E> {
         /** The main list */
-        AbstractLinkedList parent;
+        AbstractLinkedList<E> parent;
         /** Offset from the main list */
         int offset;
         /** Sublist size */
@@ -901,7 +902,7 @@ public abstract class AbstractLinkedList implements List {
         /** Sublist modCount */
         int expectedModCount;
 
-        protected LinkedSubList(AbstractLinkedList parent, int fromIndex, int 
toIndex) {
+        protected LinkedSubList(AbstractLinkedList<E> parent, int fromIndex, 
int toIndex) {
             if (fromIndex < 0) {
                 throw new IndexOutOfBoundsException("fromIndex = " + 
fromIndex);
             }
@@ -922,13 +923,13 @@ public abstract class AbstractLinkedList implements List {
             return size;
         }
 
-        public Object get(int index) {
+        public E get(int index) {
             rangeCheck(index, size);
             checkModCount();
             return parent.get(index + offset);
         }
 
-        public void add(int index, Object obj) {
+        public void add(int index, E obj) {
             rangeCheck(index, size + 1);
             checkModCount();
             parent.add(index + offset, obj);
@@ -937,21 +938,21 @@ public abstract class AbstractLinkedList implements List {
             LinkedSubList.this.modCount++;
         }
 
-        public Object remove(int index) {
+        public E remove(int index) {
             rangeCheck(index, size);
             checkModCount();
-            Object result = parent.remove(index + offset);
+            E result = parent.remove(index + offset);
             expectedModCount = parent.modCount;
             size--;
             LinkedSubList.this.modCount++;
             return result;
         }
 
-        public boolean addAll(Collection coll) {
+        public boolean addAll(Collection<? extends E> coll) {
             return addAll(size, coll);
         }
 
-        public boolean addAll(int index, Collection coll) {
+        public boolean addAll(int index, Collection<? extends E> coll) {
             rangeCheck(index, size + 1);
             int cSize = coll.size();
             if (cSize == 0) {
@@ -966,7 +967,7 @@ public abstract class AbstractLinkedList implements List {
             return true;
         }
 
-        public Object set(int index, Object obj) {
+        public E set(int index, E obj) {
             rangeCheck(index, size);
             checkModCount();
             return parent.set(index + offset, obj);
@@ -974,26 +975,26 @@ public abstract class AbstractLinkedList implements List {
 
         public void clear() {
             checkModCount();
-            Iterator it = iterator();
+            Iterator<E> it = iterator();
             while (it.hasNext()) {
                 it.next();
                 it.remove();
             }
         }
 
-        public Iterator iterator() {
+        public Iterator<E> iterator() {
             checkModCount();
             return parent.createSubListIterator(this);
         }
 
-        public ListIterator listIterator(final int index) {
+        public ListIterator<E> listIterator(final int index) {
             rangeCheck(index, size + 1);
             checkModCount();
             return parent.createSubListListIterator(this, index);
         }
 
-        public List subList(int fromIndexInclusive, int toIndexExclusive) {
-            return new LinkedSubList(parent, fromIndexInclusive + offset, 
toIndexExclusive + offset);
+        public List<E> subList(int fromIndexInclusive, int toIndexExclusive) {
+            return new LinkedSubList<E>(parent, fromIndexInclusive + offset, 
toIndexExclusive + offset);
         }
 
         protected void rangeCheck(int index, int beyond) {
@@ -1008,5 +1009,5 @@ public abstract class AbstractLinkedList implements List {
             }
         }
     }
-    
+
 }

http://git-wip-us.apache.org/repos/asf/commons-collections/blob/884baf0d/src/java/org/apache/commons/collections/list/AbstractListDecorator.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/commons/collections/list/AbstractListDecorator.java 
b/src/java/org/apache/commons/collections/list/AbstractListDecorator.java
index ecd48f2..c8550d2 100644
--- a/src/java/org/apache/commons/collections/list/AbstractListDecorator.java
+++ b/src/java/org/apache/commons/collections/list/AbstractListDecorator.java
@@ -33,9 +33,11 @@ import 
org.apache.commons.collections.collection.AbstractCollectionDecorator;
  * 
  * @author Stephen Colebourne
  */
-public abstract class AbstractListDecorator<E>
-        extends AbstractCollectionDecorator<E>
-        implements List<E> {
+public abstract class AbstractListDecorator<E> extends 
AbstractCollectionDecorator<E> implements
+        List<E> {
+
+    /** Serialization version--necessary in an abstract class? */
+    private static final long serialVersionUID = 4500739654952315623L;
 
     /**
      * Constructor only used in deserialization, do not use otherwise.

http://git-wip-us.apache.org/repos/asf/commons-collections/blob/884baf0d/src/java/org/apache/commons/collections/list/AbstractSerializableListDecorator.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/commons/collections/list/AbstractSerializableListDecorator.java
 
b/src/java/org/apache/commons/collections/list/AbstractSerializableListDecorator.java
index 7793581..eac1c3a 100644
--- 
a/src/java/org/apache/commons/collections/list/AbstractSerializableListDecorator.java
+++ 
b/src/java/org/apache/commons/collections/list/AbstractSerializableListDecorator.java
@@ -29,8 +29,8 @@ import java.util.List;
  * @author Stephen Colebourne
  * @since Commons Collections 3.1
  */
-public abstract class AbstractSerializableListDecorator
-        extends AbstractListDecorator
+public abstract class AbstractSerializableListDecorator<E>
+        extends AbstractListDecorator<E>
         implements Serializable {
 
     /** Serialization version */
@@ -39,7 +39,7 @@ public abstract class AbstractSerializableListDecorator
     /**
      * Constructor.
      */
-    protected AbstractSerializableListDecorator(List list) {
+    protected AbstractSerializableListDecorator(List<E> list) {
         super(list);
     }
 
@@ -62,9 +62,10 @@ public abstract class AbstractSerializableListDecorator
      * @throws IOException
      * @throws ClassNotFoundException
      */
+    @SuppressWarnings("unchecked")
     private void readObject(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
         in.defaultReadObject();
-        collection = (Collection) in.readObject();
+        collection = (Collection<E>) in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/commons-collections/blob/884baf0d/src/java/org/apache/commons/collections/list/CursorableLinkedList.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/commons/collections/list/CursorableLinkedList.java 
b/src/java/org/apache/commons/collections/list/CursorableLinkedList.java
index b6ce57d..022eaaa 100644
--- a/src/java/org/apache/commons/collections/list/CursorableLinkedList.java
+++ b/src/java/org/apache/commons/collections/list/CursorableLinkedList.java
@@ -60,13 +60,13 @@ import java.util.ListIterator;
  * @author Simon Kitching
  * @author Stephen Colebourne
  */
-public class CursorableLinkedList extends AbstractLinkedList implements 
Serializable {
+public class CursorableLinkedList<E> extends AbstractLinkedList<E> implements 
Serializable {
 
     /** Ensure serialization compatibility */
     private static final long serialVersionUID = 8836393098519411393L;
 
     /** A list of the cursor currently open on this list */
-    protected transient List cursors = new ArrayList();
+    protected transient List<WeakReference<Cursor<E>>> cursors;
 
     //-----------------------------------------------------------------------
     /**
@@ -82,7 +82,7 @@ public class CursorableLinkedList extends AbstractLinkedList 
implements Serializ
      * 
      * @param coll  the collection to copy
      */
-    public CursorableLinkedList(Collection coll) {
+    public CursorableLinkedList(Collection<E> coll) {
         super(coll);
     }
 
@@ -92,7 +92,7 @@ public class CursorableLinkedList extends AbstractLinkedList 
implements Serializ
      */
     protected void init() {
         super.init();
-        cursors = new ArrayList();
+        cursors = new ArrayList<WeakReference<Cursor<E>>>();
     }
 
     //-----------------------------------------------------------------------
@@ -105,7 +105,7 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
      * 
      * @return a new iterator that does <b>not</b> support concurrent 
modification
      */
-    public Iterator iterator() {
+    public Iterator<E> iterator() {
         return super.listIterator(0);
     }
 
@@ -124,7 +124,7 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
      * 
      * @return a new cursor iterator
      */
-    public ListIterator listIterator() {
+    public ListIterator<E> listIterator() {
         return cursor(0);
     }
 
@@ -144,7 +144,7 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
      * @param fromIndex  the index to start from
      * @return a new cursor iterator
      */
-    public ListIterator listIterator(int fromIndex) {
+    public ListIterator<E> listIterator(int fromIndex) {
         return cursor(fromIndex);
     }
 
@@ -171,7 +171,7 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
      *
      * @return a new cursor iterator
      */
-    public CursorableLinkedList.Cursor cursor() {
+    public CursorableLinkedList.Cursor<E> cursor() {
         return cursor(0);
     }
 
@@ -202,8 +202,8 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
      * @throws IndexOutOfBoundsException if the index is out of range
      *      (index &lt; 0 || index &gt; size()).
      */
-    public CursorableLinkedList.Cursor cursor(int fromIndex) {
-        Cursor cursor = new Cursor(this, fromIndex);
+    public CursorableLinkedList.Cursor<E> cursor(int fromIndex) {
+        Cursor<E> cursor = new Cursor<E>(this, fromIndex);
         registerCursor(cursor);
         return cursor;
     }
@@ -217,7 +217,7 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
      * @param node  node to update
      * @param value  new value of the node
      */
-    protected void updateNode(Node node, Object value) {
+    protected void updateNode(Node<E> node, E value) {
         super.updateNode(node, value);
         broadcastNodeChanged(node);
     }
@@ -229,7 +229,7 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
      * @param insertBeforeNode  node to insert before
      * @throws NullPointerException if either node is null
      */
-    protected void addNode(Node nodeToInsert, Node insertBeforeNode) {
+    protected void addNode(Node<E> nodeToInsert, Node<E> insertBeforeNode) {
         super.addNode(nodeToInsert, insertBeforeNode);
         broadcastNodeInserted(nodeToInsert);
     }
@@ -240,7 +240,7 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
      * @param node  the node to remove
      * @throws NullPointerException if <code>node</code> is null
      */
-    protected void removeNode(Node node) {
+    protected void removeNode(Node<E> node) {
         super.removeNode(node);
         broadcastNodeRemoved(node);
     }
@@ -251,7 +251,7 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
     protected void removeAllNodes() {
         if (size() > 0) {
             // superclass implementation would break all the iterators
-            Iterator it = iterator();
+            Iterator<E> it = iterator();
             while (it.hasNext()) {
                 it.next();
                 it.remove();
@@ -265,16 +265,16 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
      * 
      * @param cursor  the cursor to register
      */
-    protected void registerCursor(Cursor cursor) {
+    protected void registerCursor(Cursor<E> cursor) {
         // We take this opportunity to clean the cursors list
         // of WeakReference objects to garbage-collected cursors.
-        for (Iterator it = cursors.iterator(); it.hasNext();) {
-            WeakReference ref = (WeakReference) it.next();
+        for (Iterator<WeakReference<Cursor<E>>> it = cursors.iterator(); 
it.hasNext();) {
+            WeakReference<Cursor<E>> ref = it.next();
             if (ref.get() == null) {
                 it.remove();
             }
         }
-        cursors.add(new WeakReference(cursor));
+        cursors.add(new WeakReference<Cursor<E>>(cursor));
     }
 
     /**
@@ -282,16 +282,15 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
      * 
      * @param cursor  the cursor to deregister
      */
-    protected void unregisterCursor(Cursor cursor) {
-        for (Iterator it = cursors.iterator(); it.hasNext();) {
-            WeakReference ref = (WeakReference) it.next();
-            Cursor cur = (Cursor) ref.get();
+    protected void unregisterCursor(Cursor<E> cursor) {
+        for (Iterator<WeakReference<Cursor<E>>> it = cursors.iterator(); 
it.hasNext();) {
+            WeakReference<Cursor<E>> ref = it.next();
+            Cursor<E> cur = ref.get();
             if (cur == null) {
                 // some other unrelated cursor object has been 
                 // garbage-collected; let's take the opportunity to
                 // clean up the cursors list anyway..
                 it.remove();
-
             } else if (cur == cursor) {
                 ref.clear();
                 it.remove();
@@ -307,11 +306,11 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
      * 
      * @param node  the node that was changed
      */
-    protected void broadcastNodeChanged(Node node) {
-        Iterator it = cursors.iterator();
+    protected void broadcastNodeChanged(Node<E> node) {
+        Iterator<WeakReference<Cursor<E>>> it = cursors.iterator();
         while (it.hasNext()) {
-            WeakReference ref = (WeakReference) it.next();
-            Cursor cursor = (Cursor) ref.get();
+            WeakReference<Cursor<E>> ref = it.next();
+            Cursor<E> cursor = ref.get();
             if (cursor == null) {
                 it.remove(); // clean up list
             } else {
@@ -326,11 +325,11 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
      * 
      * @param node  the node that was changed
      */
-    protected void broadcastNodeRemoved(Node node) {
-        Iterator it = cursors.iterator();
+    protected void broadcastNodeRemoved(Node<E> node) {
+        Iterator<WeakReference<Cursor<E>>> it = cursors.iterator();
         while (it.hasNext()) {
-            WeakReference ref = (WeakReference) it.next();
-            Cursor cursor = (Cursor) ref.get();
+            WeakReference<Cursor<E>> ref = it.next();
+            Cursor<E> cursor = ref.get();
             if (cursor == null) {
                 it.remove(); // clean up list
             } else {
@@ -345,11 +344,11 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
      * 
      * @param node  the node that was changed
      */
-    protected void broadcastNodeInserted(Node node) {
-        Iterator it = cursors.iterator();
+    protected void broadcastNodeInserted(Node<E> node) {
+        Iterator<WeakReference<Cursor<E>>> it = cursors.iterator();
         while (it.hasNext()) {
-            WeakReference ref = (WeakReference) it.next();
-            Cursor cursor = (Cursor) ref.get();
+            WeakReference<Cursor<E>> ref = it.next();
+            Cursor<E> cursor = ref.get();
             if (cursor == null) {
                 it.remove(); // clean up list
             } else {
@@ -382,8 +381,8 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
      * @param subList  the sublist to get an iterator for
      * @param fromIndex  the index to start from, relative to the sublist
      */
-    protected ListIterator createSubListListIterator(LinkedSubList subList, 
int fromIndex) {
-        SubCursor cursor = new SubCursor(subList, fromIndex);
+    protected ListIterator<E> createSubListListIterator(LinkedSubList<E> 
subList, int fromIndex) {
+        SubCursor<E> cursor = new SubCursor<E>(subList, fromIndex);
         registerCursor(cursor);
         return cursor;
     }
@@ -393,7 +392,7 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
      * An extended <code>ListIterator</code> that allows concurrent changes to
      * the underlying list.
      */
-    public static class Cursor extends AbstractLinkedList.LinkedListIterator {
+    public static class Cursor<E> extends 
AbstractLinkedList.LinkedListIterator<E> {
         /** Is the cursor valid (not closed) */
         boolean valid = true;
         /** Is the next index valid */
@@ -406,7 +405,7 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
          * 
          * @param index  the index to start from
          */
-        protected Cursor(CursorableLinkedList parent, int index) {
+        protected Cursor(CursorableLinkedList<E> parent, int index) {
             super(parent, index);
             valid = true;
         }
@@ -443,7 +442,7 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
          * 
          * @param obj  the object to add
          */
-        public void add(Object obj) {
+        public void add(E obj) {
             // overridden, as the nodeInserted() method updates the iterator 
state
             super.add(obj);
             // matches the (next.previous == node) clause in nodeInserted()
@@ -467,7 +466,7 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
                     nextIndex = parent.size();
                 } else {
                     int pos = 0;
-                    Node temp = parent.header.next;
+                    Node<E> temp = parent.header.next;
                     while (temp != next) {
                         pos++;
                         temp = temp.next;
@@ -484,7 +483,7 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
          * 
          * @param node  the node that changed
          */
-        protected void nodeChanged(Node node) {
+        protected void nodeChanged(Node<E> node) {
             // do nothing
         }
 
@@ -493,7 +492,7 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
          * 
          * @param node  the node that was removed
          */
-        protected void nodeRemoved(Node node) {
+        protected void nodeRemoved(Node<E> node) {
             if (node == next && node == current) {
                 // state where next() followed by previous()
                 next = node.next;
@@ -521,7 +520,7 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
          * 
          * @param node  the node that was added
          */
-        protected void nodeInserted(Node node) {
+        protected void nodeInserted(Node<E> node) {
             if (node.previous == current) {
                 next = node;
             } else if (next.previous == node) {
@@ -550,7 +549,7 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
          */
         public void close() {
             if (valid) {
-                ((CursorableLinkedList) parent).unregisterCursor(this);
+                ((CursorableLinkedList<E>) parent).unregisterCursor(this);
                 valid = false;
             }
         }
@@ -562,18 +561,18 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
      *
      * @since Commons Collections 3.2
      */
-    protected static class SubCursor extends Cursor {
+    protected static class SubCursor<E> extends Cursor<E> {
 
         /** The parent list */
-        protected final LinkedSubList sub;
+        protected final LinkedSubList<E> sub;
 
         /**
          * Constructs a new cursor.
          * 
          * @param index  the index to start from
          */
-        protected SubCursor(LinkedSubList sub, int index) {
-            super((CursorableLinkedList) sub.parent, index + sub.offset);
+        protected SubCursor(LinkedSubList<E> sub, int index) {
+            super((CursorableLinkedList<E>) sub.parent, index + sub.offset);
             this.sub = sub;
         }
 
@@ -589,7 +588,7 @@ public class CursorableLinkedList extends 
AbstractLinkedList implements Serializ
             return (super.nextIndex() - sub.offset);
         }
 
-        public void add(Object obj) {
+        public void add(E obj) {
             super.add(obj);
             sub.expectedModCount = parent.modCount;
             sub.size++;

http://git-wip-us.apache.org/repos/asf/commons-collections/blob/884baf0d/src/java/org/apache/commons/collections/list/FixedSizeList.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/commons/collections/list/FixedSizeList.java 
b/src/java/org/apache/commons/collections/list/FixedSizeList.java
index 8709bbe..65e0955 100644
--- a/src/java/org/apache/commons/collections/list/FixedSizeList.java
+++ b/src/java/org/apache/commons/collections/list/FixedSizeList.java
@@ -39,9 +39,9 @@ import 
org.apache.commons.collections.iterators.UnmodifiableIterator;
  * @author Stephen Colebourne
  * @author Paul Jack
  */
-public class FixedSizeList
-        extends AbstractSerializableListDecorator
-        implements BoundedCollection {
+public class FixedSizeList<E>
+        extends AbstractSerializableListDecorator<E>
+        implements BoundedCollection<E> {
 
     /** Serialization version */
     private static final long serialVersionUID = -2218010673611160319L;
@@ -52,8 +52,8 @@ public class FixedSizeList
      * @param list  the list to decorate, must not be null
      * @throws IllegalArgumentException if list is null
      */
-    public static List decorate(List list) {
-        return new FixedSizeList(list);
+    public static <E> List<E> decorate(List<E> list) {
+        return new FixedSizeList<E>(list);
     }
 
     //-----------------------------------------------------------------------
@@ -63,24 +63,24 @@ public class FixedSizeList
      * @param list  the list to decorate, must not be null
      * @throws IllegalArgumentException if list is null
      */
-    protected FixedSizeList(List list) {
+    protected FixedSizeList(List<E> list) {
         super(list);
     }
 
     //-----------------------------------------------------------------------
-    public boolean add(Object object) {
+    public boolean add(E object) {
         throw new UnsupportedOperationException("List is fixed size");
     }
 
-    public void add(int index, Object object) {
+    public void add(int index, E object) {
         throw new UnsupportedOperationException("List is fixed size");
     }
 
-    public boolean addAll(Collection coll) {
+    public boolean addAll(Collection<? extends E> coll) {
         throw new UnsupportedOperationException("List is fixed size");
     }
 
-    public boolean addAll(int index, Collection coll) {
+    public boolean addAll(int index, Collection<? extends E> coll) {
         throw new UnsupportedOperationException("List is fixed size");
     }
 
@@ -88,7 +88,7 @@ public class FixedSizeList
         throw new UnsupportedOperationException("List is fixed size");
     }
 
-    public Object get(int index) {
+    public E get(int index) {
         return decorated().get(index);
     }
 
@@ -96,7 +96,7 @@ public class FixedSizeList
         return decorated().indexOf(object);
     }
 
-    public Iterator iterator() {
+    public Iterator<E> iterator() {
         return UnmodifiableIterator.decorate(decorated().iterator());
     }
 
@@ -104,15 +104,15 @@ public class FixedSizeList
         return decorated().lastIndexOf(object);
     }
 
-    public ListIterator listIterator() {
+    public ListIterator<E> listIterator() {
         return new FixedSizeListIterator(decorated().listIterator(0));
     }
 
-    public ListIterator listIterator(int index) {
+    public ListIterator<E> listIterator(int index) {
         return new FixedSizeListIterator(decorated().listIterator(index));
     }
 
-    public Object remove(int index) {
+    public E remove(int index) {
         throw new UnsupportedOperationException("List is fixed size");
     }
 
@@ -120,28 +120,28 @@ public class FixedSizeList
         throw new UnsupportedOperationException("List is fixed size");
     }
 
-    public boolean removeAll(Collection coll) {
+    public boolean removeAll(Collection<?> coll) {
         throw new UnsupportedOperationException("List is fixed size");
     }
 
-    public boolean retainAll(Collection coll) {
+    public boolean retainAll(Collection<?> coll) {
         throw new UnsupportedOperationException("List is fixed size");
     }
 
-    public Object set(int index, Object object) {
+    public E set(int index, E object) {
         return decorated().set(index, object);
     }
 
-    public List subList(int fromIndex, int toIndex) {
-        List sub = decorated().subList(fromIndex, toIndex);
-        return new FixedSizeList(sub);
+    public List<E> subList(int fromIndex, int toIndex) {
+        List<E> sub = decorated().subList(fromIndex, toIndex);
+        return new FixedSizeList<E>(sub);
     }
 
     /**
      * List iterator that only permits changes via set()
      */
-    static class FixedSizeListIterator extends AbstractListIteratorDecorator {
-        protected FixedSizeListIterator(ListIterator iterator) {
+    private class FixedSizeListIterator extends 
AbstractListIteratorDecorator<E> {
+        protected FixedSizeListIterator(ListIterator<E> iterator) {
             super(iterator);
         }
         public void remove() {

http://git-wip-us.apache.org/repos/asf/commons-collections/blob/884baf0d/src/java/org/apache/commons/collections/list/GrowthList.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/commons/collections/list/GrowthList.java 
b/src/java/org/apache/commons/collections/list/GrowthList.java
index ae2f652..bdf7c21 100644
--- a/src/java/org/apache/commons/collections/list/GrowthList.java
+++ b/src/java/org/apache/commons/collections/list/GrowthList.java
@@ -55,7 +55,7 @@ import java.util.List;
  * @author Stephen Colebourne
  * @author Paul Legato
  */
-public class GrowthList extends AbstractSerializableListDecorator {
+public class GrowthList<E> extends AbstractSerializableListDecorator<E> {
 
     /** Serialization version */
     private static final long serialVersionUID = -3620001881672L;
@@ -66,8 +66,8 @@ public class GrowthList extends 
AbstractSerializableListDecorator {
      * @param list  the list to decorate, must not be null
      * @throws IllegalArgumentException if list is null
      */
-    public static List decorate(List list) {
-        return new GrowthList(list);
+    public static <E> List<E> decorate(List<E> list) {
+        return new GrowthList<E>(list);
     }
 
     //-----------------------------------------------------------------------
@@ -75,7 +75,7 @@ public class GrowthList extends 
AbstractSerializableListDecorator {
      * Constructor that uses an ArrayList internally.
      */
     public GrowthList() {
-        super(new ArrayList());
+        super(new ArrayList<E>());
     }
 
     /**
@@ -85,7 +85,7 @@ public class GrowthList extends 
AbstractSerializableListDecorator {
      * @throws IllegalArgumentException if initial size is invalid
      */
     public GrowthList(int initialSize) {
-        super(new ArrayList(initialSize));
+        super(new ArrayList<E>(initialSize));
     }
 
     /**
@@ -94,7 +94,7 @@ public class GrowthList extends 
AbstractSerializableListDecorator {
      * @param list  the list to decorate, must not be null
      * @throws IllegalArgumentException if list is null
      */
-    protected GrowthList(List list) {
+    protected GrowthList(List<E> list) {
         super(list);
     }
 
@@ -117,10 +117,10 @@ public class GrowthList extends 
AbstractSerializableListDecorator {
      * @throws ClassCastException if the underlying list rejects the element
      * @throws IllegalArgumentException if the underlying list rejects the 
element
      */
-    public void add(int index, Object element) {
+    public void add(int index, E element) {
         int size = decorated().size();
         if (index > size) {
-            decorated().addAll(Collections.nCopies(index - size, null));
+            decorated().addAll(Collections.<E>nCopies(index - size, null));
         }
         decorated().add(index, element);
     }
@@ -145,11 +145,11 @@ public class GrowthList extends 
AbstractSerializableListDecorator {
      * @throws ClassCastException if the underlying list rejects the element
      * @throws IllegalArgumentException if the underlying list rejects the 
element
      */
-    public boolean addAll(int index, Collection coll) {
+    public boolean addAll(int index, Collection<? extends E> coll) {
         int size = decorated().size();
         boolean result = false;
         if (index > size) {
-            decorated().addAll(Collections.nCopies(index - size, null));
+            decorated().addAll(Collections.<E>nCopies(index - size, null));
             result = true;
         }
         return (decorated().addAll(index, coll) | result);
@@ -175,10 +175,10 @@ public class GrowthList extends 
AbstractSerializableListDecorator {
      * @throws ClassCastException if the underlying list rejects the element
      * @throws IllegalArgumentException if the underlying list rejects the 
element
      */
-    public Object set(int index, Object element) {
+    public E set(int index, E element) {
         int size = decorated().size();
         if (index >= size) {
-            decorated().addAll(Collections.nCopies((index - size) + 1, null));
+            decorated().addAll(Collections.<E>nCopies((index - size) + 1, 
null));
         }
         return decorated().set(index, element);
     }

http://git-wip-us.apache.org/repos/asf/commons-collections/blob/884baf0d/src/java/org/apache/commons/collections/list/LazyList.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/commons/collections/list/LazyList.java 
b/src/java/org/apache/commons/collections/list/LazyList.java
index ad83195..f1b11c3 100644
--- a/src/java/org/apache/commons/collections/list/LazyList.java
+++ b/src/java/org/apache/commons/collections/list/LazyList.java
@@ -61,13 +61,13 @@ import org.apache.commons.collections.Factory;
  * @author Arron Bates
  * @author Paul Jack
  */
-public class LazyList extends AbstractSerializableListDecorator {
+public class LazyList<E> extends AbstractSerializableListDecorator<E> {
 
     /** Serialization version */
     private static final long serialVersionUID = -1708388017160694542L;
 
     /** The factory to use to lazily instantiate the objects */
-    protected final Factory factory;
+    protected final Factory<? extends E> factory;
 
     /**
      * Factory method to create a lazily instantiating list.
@@ -76,8 +76,8 @@ public class LazyList extends 
AbstractSerializableListDecorator {
      * @param factory  the factory to use for creation, must not be null
      * @throws IllegalArgumentException if list or factory is null
      */
-    public static List decorate(List list, Factory factory) {
-        return new LazyList(list, factory);
+    public static <E> List<E> decorate(List<E> list, Factory<? extends E> 
factory) {
+        return new LazyList<E>(list, factory);
     }
     
     //-----------------------------------------------------------------------
@@ -88,7 +88,7 @@ public class LazyList extends 
AbstractSerializableListDecorator {
      * @param factory  the factory to use for creation, must not be null
      * @throws IllegalArgumentException if list or factory is null
      */
-    protected LazyList(List list, Factory factory) {
+    protected LazyList(List<E> list, Factory<? extends E> factory) {
         super(list);
         if (factory == null) {
             throw new IllegalArgumentException("Factory must not be null");
@@ -107,36 +107,33 @@ public class LazyList extends 
AbstractSerializableListDecorator {
      * 
      * @param index  the index to retrieve
      */
-    public Object get(int index) {
+    public E get(int index) {
         int size = decorated().size();
         if (index < size) {
             // within bounds, get the object
-            Object object = decorated().get(index);
+            E object = decorated().get(index);
             if (object == null) {
                 // item is a place holder, create new one, set and return
                 object = factory.create();
                 decorated().set(index, object);
                 return object;
-            } else {
-                // good and ready to go
-                return object;
-            }
-        } else {
-            // we have to grow the list
-            for (int i = size; i < index; i++) {
-                decorated().add(null);
             }
-            // create our last object, set and return
-            Object object = factory.create();
-            decorated().add(object);
+            // good and ready to go
             return object;
         }
+        // we have to grow the list
+        for (int i = size; i < index; i++) {
+            decorated().add(null);
+        }
+        // create our last object, set and return
+        E object = factory.create();
+        decorated().add(object);
+        return object;
     }
 
-
-    public List subList(int fromIndex, int toIndex) {
-        List sub = decorated().subList(fromIndex, toIndex);
-        return new LazyList(sub, factory);
+    public List<E> subList(int fromIndex, int toIndex) {
+        List<E> sub = decorated().subList(fromIndex, toIndex);
+        return new LazyList<E>(sub, factory);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/commons-collections/blob/884baf0d/src/java/org/apache/commons/collections/list/NodeCachingLinkedList.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/commons/collections/list/NodeCachingLinkedList.java 
b/src/java/org/apache/commons/collections/list/NodeCachingLinkedList.java
index f997043..0b5a13f 100644
--- a/src/java/org/apache/commons/collections/list/NodeCachingLinkedList.java
+++ b/src/java/org/apache/commons/collections/list/NodeCachingLinkedList.java
@@ -44,7 +44,7 @@ import java.util.Collection;
  * @author Phil Steitz
  * @author Stephen Colebourne
  */
-public class NodeCachingLinkedList extends AbstractLinkedList implements 
Serializable {
+public class NodeCachingLinkedList<E> extends AbstractLinkedList<E> implements 
Serializable {
 
     /** Serialization version */
     private static final long serialVersionUID = 6897789178562232073L;
@@ -59,7 +59,7 @@ public class NodeCachingLinkedList extends AbstractLinkedList 
implements Seriali
      * Cached nodes are stored in a singly-linked list with
      * <code>next</code> pointing to the next element.
      */
-    protected transient Node firstCachedNode;
+    protected transient Node<E> firstCachedNode;
     
     /**
      * The size of the cache.
@@ -84,7 +84,7 @@ public class NodeCachingLinkedList extends AbstractLinkedList 
implements Seriali
      * 
      * @param coll  the collection to copy
      */
-    public NodeCachingLinkedList(Collection coll) {
+    public NodeCachingLinkedList(Collection<E> coll) {
         super(coll);
         this.maximumCacheSize = DEFAULT_MAXIMUM_CACHE_SIZE;
     }
@@ -137,11 +137,11 @@ public class NodeCachingLinkedList extends 
AbstractLinkedList implements Seriali
      *
      * @return a node, or <code>null</code> if there are no nodes in the cache.
      */
-    protected Node getNodeFromCache() {
+    protected Node<E> getNodeFromCache() {
         if (cacheSize == 0) {
             return null;
         }
-        Node cachedNode = firstCachedNode;
+        Node<E> cachedNode = firstCachedNode;
         firstCachedNode = cachedNode.next;
         cachedNode.next = null; // This should be changed anyway, but 
defensively
                                 // set it to null.                    
@@ -164,13 +164,13 @@ public class NodeCachingLinkedList extends 
AbstractLinkedList implements Seriali
      * 
      * @param node  the node to add to the cache
      */
-    protected void addNodeToCache(Node node) {
+    protected void addNodeToCache(Node<E> node) {
         if (isCacheFull()) {
             // don't cache the node.
             return;
         }
         // clear the node's contents and add it to the cache.
-        Node nextCachedNode = firstCachedNode;
+        Node<E> nextCachedNode = firstCachedNode;
         node.previous = null;
         node.next = nextCachedNode;
         node.setValue(null);
@@ -186,14 +186,13 @@ public class NodeCachingLinkedList extends 
AbstractLinkedList implements Seriali
      * @param value  value of the new node
      * @return the newly created node
      */
-    protected Node createNode(Object value) {
-        Node cachedNode = getNodeFromCache();
+    protected Node<E> createNode(E value) {
+        Node<E> cachedNode = getNodeFromCache();
         if (cachedNode == null) {
             return super.createNode(value);
-        } else {
-            cachedNode.setValue(value);
-            return cachedNode;
         }
+        cachedNode.setValue(value);
+        return cachedNode;
     }
 
     /**
@@ -202,7 +201,7 @@ public class NodeCachingLinkedList extends 
AbstractLinkedList implements Seriali
      * 
      * @param node  the node to remove
      */
-    protected void removeNode(Node node) {
+    protected void removeNode(Node<E> node) {
         super.removeNode(node);
         addNodeToCache(node);
     }
@@ -218,9 +217,9 @@ public class NodeCachingLinkedList extends 
AbstractLinkedList implements Seriali
         // {@link AbstractLinkedList.removeAllNodes()} removes the
         // nodes by removing references directly from {@link #header}.
         int numberOfNodesToCache = Math.min(size, maximumCacheSize - 
cacheSize);
-        Node node = header.next;
+        Node<E> node = header.next;
         for (int currentIndex = 0; currentIndex < numberOfNodesToCache; 
currentIndex++) {
-            Node oldNode = node;
+            Node<E> oldNode = node;
             node = node.next;
             addNodeToCache(oldNode);
         }

http://git-wip-us.apache.org/repos/asf/commons-collections/blob/884baf0d/src/java/org/apache/commons/collections/list/SetUniqueList.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/commons/collections/list/SetUniqueList.java 
b/src/java/org/apache/commons/collections/list/SetUniqueList.java
index f70311c..cc32cbf 100644
--- a/src/java/org/apache/commons/collections/list/SetUniqueList.java
+++ b/src/java/org/apache/commons/collections/list/SetUniqueList.java
@@ -5,9 +5,9 @@
  * The ASF licenses this file to You under the Apache License, Version 2.0
  * (the "License"); you may not use this file except in compliance with
  * the License.  You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -46,12 +46,12 @@ import org.apache.commons.collections.set.UnmodifiableSet;
  *
  * @since Commons Collections 3.0
  * @version $Revision$ $Date$
- * 
+ *
  * @author Matthew Hawthorne
  * @author Stephen Colebourne
  * @author Tom Dunham
  */
-public class SetUniqueList extends AbstractSerializableListDecorator {
+public class SetUniqueList<E> extends AbstractSerializableListDecorator<E> {
 
     /** Serialization version */
     private static final long serialVersionUID = 7196982186153478694L;
@@ -59,30 +59,29 @@ public class SetUniqueList extends 
AbstractSerializableListDecorator {
     /**
      * Internal Set to maintain uniqueness.
      */
-    protected final Set set;
+    protected final Set<E> set;
 
     /**
      * Factory method to create a SetList using the supplied list to retain 
order.
      * <p>
      * If the list contains duplicates, these are removed (first indexed one 
kept).
      * A <code>HashSet</code> is used for the set behaviour.
-     * 
+     *
      * @param list  the list to decorate, must not be null
      * @throws IllegalArgumentException if list is null
      */
-    public static SetUniqueList decorate(List list) {
+    public static <E> SetUniqueList<E> decorate(List<E> list) {
         if (list == null) {
             throw new IllegalArgumentException("List must not be null");
         }
         if (list.isEmpty()) {
-            return new SetUniqueList(list, new HashSet());
-        } else {
-            List temp = new ArrayList(list);
-            list.clear();
-            SetUniqueList sl = new SetUniqueList(list, new HashSet());
-            sl.addAll(temp);
-            return sl;
+            return new SetUniqueList<E>(list, new HashSet<E>());
         }
+        List<E> temp = new ArrayList<E>(list);
+        list.clear();
+        SetUniqueList<E> sl = new SetUniqueList<E>(list, new HashSet<E>());
+        sl.addAll(temp);
+        return sl;
     }
 
     //-----------------------------------------------------------------------
@@ -90,12 +89,12 @@ public class SetUniqueList extends 
AbstractSerializableListDecorator {
      * Constructor that wraps (not copies) the List and specifies the set to 
use.
      * <p>
      * The set and list must both be correctly initialised to the same 
elements.
-     * 
+     *
      * @param set  the set to decorate, must not be null
      * @param list  the list to decorate, must not be null
      * @throws IllegalArgumentException if set or list is null
      */
-    protected SetUniqueList(List list, Set set) {
+    protected SetUniqueList(List<E> list, Set<E> set) {
         super(list);
         if (set == null) {
             throw new IllegalArgumentException("Set must not be null");
@@ -106,10 +105,10 @@ public class SetUniqueList extends 
AbstractSerializableListDecorator {
     //-----------------------------------------------------------------------
     /**
      * Gets an unmodifiable view as a Set.
-     * 
+     *
      * @return an unmodifiable set view
      */
-    public Set asSet() {
+    public Set<E> asSet() {
         return UnmodifiableSet.decorate(set);
     }
 
@@ -121,11 +120,11 @@ public class SetUniqueList extends 
AbstractSerializableListDecorator {
      * The <code>List</code> interface requires that this method returns
      * <code>true</code> always. However this class may return 
<code>false</code>
      * because of the <code>Set</code> behaviour.
-     * 
+     *
      * @param object the object to add
      * @return true if object was added
      */
-    public boolean add(Object object) {
+    public boolean add(E object) {
         // gets initial size
         final int sizeBefore = size();
 
@@ -142,11 +141,11 @@ public class SetUniqueList extends 
AbstractSerializableListDecorator {
      * <i>(Violation)</i>
      * The <code>List</code> interface makes the assumption that the element is
      * always inserted. This may not happen with this implementation.
-     * 
+     *
      * @param index  the index to insert at
      * @param object  the object to add
      */
-    public void add(int index, Object object) {
+    public void add(int index, E object) {
         // adds element if it is not contained already
         if (set.contains(object) == false) {
             super.add(index, object);
@@ -160,10 +159,10 @@ public class SetUniqueList extends 
AbstractSerializableListDecorator {
      * <i>(Violation)</i>
      * The <code>List</code> interface makes the assumption that the element is
      * always inserted. This may not happen with this implementation.
-     * 
+     *
      * @param coll  the collection to add
      */
-    public boolean addAll(Collection coll) {
+    public boolean addAll(Collection<? extends E> coll) {
         return addAll(size(), coll);
     }
 
@@ -176,22 +175,24 @@ public class SetUniqueList extends 
AbstractSerializableListDecorator {
      * <i>(Violation)</i>
      * The <code>List</code> interface makes the assumption that the elements
      * are always inserted. This may not happen with this implementation.
-     * 
+     *
      * @param index  the index to insert at
      * @param coll  the collection to add in iterator order
      * @return true if this collection changed
      */
-    public boolean addAll(int index, Collection coll) {
-        // gets initial size
-        final int sizeBefore = size();
-
-        // adds all elements
-        for (final Iterator it = coll.iterator(); it.hasNext();) {
-            add(it.next());
+    public boolean addAll(int index, Collection<? extends E> coll) {
+        HashSet<E> temp = new HashSet<E>(coll);
+        temp.removeAll(set);
+        if (temp.isEmpty()) {
+            return false;
         }
-
-        // compares sizes to detect if collection changed
-        return sizeBefore != size();
+        for (E e : coll) {
+            if (temp.contains(e)) {
+                add(index, e);
+                index++;
+            }
+        }
+        return true;
     }
 
     //-----------------------------------------------------------------------
@@ -202,18 +203,18 @@ public class SetUniqueList extends 
AbstractSerializableListDecorator {
      * Afterwards, any previous duplicate is removed
      * If the object is not already in the list then a normal set occurs.
      * If it is present, then the old version is removed.
-     * 
+     *
      * @param index  the index to insert at
      * @param object  the object to set
      * @return the previous object
      */
-    public Object set(int index, Object object) {
+    public E set(int index, E object) {
         int pos = indexOf(object);
-        Object removed = super.set(index, object);
+        E removed = super.set(index, object);
         if (pos == -1 || pos == index) {
             return removed;
         }
-        
+
         // the object is already in the uniq list
         // (and it hasn't been swapped with itself)
         super.remove(pos);  // remove the duplicate by index
@@ -227,19 +228,19 @@ public class SetUniqueList extends 
AbstractSerializableListDecorator {
         return result;
     }
 
-    public Object remove(int index) {
-        Object result = super.remove(index);
+    public E remove(int index) {
+        E result = super.remove(index);
         set.remove(result);
         return result;
     }
 
-    public boolean removeAll(Collection coll) {
+    public boolean removeAll(Collection<?> coll) {
         boolean result = super.removeAll(coll);
         set.removeAll(coll);
         return result;
     }
 
-    public boolean retainAll(Collection coll) {
+    public boolean retainAll(Collection<?> coll) {
         boolean result = super.retainAll(coll);
         set.retainAll(coll);
         return result;
@@ -254,41 +255,61 @@ public class SetUniqueList extends 
AbstractSerializableListDecorator {
         return set.contains(object);
     }
 
-    public boolean containsAll(Collection coll) {
+    public boolean containsAll(Collection<?> coll) {
         return set.containsAll(coll);
     }
 
-    public Iterator iterator() {
-        return new SetListIterator(super.iterator(), set);
+    public Iterator<E> iterator() {
+        return new SetListIterator<E>(super.iterator(), set);
+    }
+
+    public ListIterator<E> listIterator() {
+        return new SetListListIterator<E>(super.listIterator(), set);
     }
 
-    public ListIterator listIterator() {
-        return new SetListListIterator(super.listIterator(), set);
+    public ListIterator<E> listIterator(int index) {
+        return new SetListListIterator<E>(super.listIterator(index), set);
     }
 
-    public ListIterator listIterator(int index) {
-        return new SetListListIterator(super.listIterator(index), set);
+    public List<E> subList(int fromIndex, int toIndex) {
+        List<E> superSubList = super.subList(fromIndex, toIndex);
+        Set<E> subSet = createSetBasedOnList(set, superSubList);
+        return new SetUniqueList<E>(superSubList, subSet);
     }
 
-    public List subList(int fromIndex, int toIndex) {
-        return new SetUniqueList(super.subList(fromIndex, toIndex), set);
+    @SuppressWarnings("unchecked")
+    protected Set<E> createSetBasedOnList(Set<E> set, List<E> list) {
+        Set<E> subSet = null;
+        if (set.getClass().equals(HashSet.class)) {
+            subSet = new HashSet<E>();
+        } else {
+            try {
+                subSet = (Set<E>) set.getClass().newInstance();
+            } catch (InstantiationException ie) {
+                subSet = new HashSet<E>();
+            } catch (IllegalAccessException iae) {
+                subSet = new HashSet<E>();
+            }
+        }
+        subSet.addAll(list);
+        return subSet;
     }
 
     //-----------------------------------------------------------------------
     /**
      * Inner class iterator.
      */
-    static class SetListIterator extends AbstractIteratorDecorator {
-        
-        protected final Set set;
-        protected Object last = null;
-        
-        protected SetListIterator(Iterator it, Set set) {
+    static class SetListIterator<E> extends AbstractIteratorDecorator<E> {
+
+        protected final Set<E> set;
+        protected E last = null;
+
+        protected SetListIterator(Iterator<E> it, Set<E> set) {
             super(it);
             this.set = set;
         }
-        
-        public Object next() {
+
+        public E next() {
             last = super.next();
             return last;
         }
@@ -299,26 +320,26 @@ public class SetUniqueList extends 
AbstractSerializableListDecorator {
             last = null;
         }
     }
-    
+
     /**
      * Inner class iterator.
      */
-    static class SetListListIterator extends AbstractListIteratorDecorator {
-        
-        protected final Set set;
-        protected Object last = null;
-        
-        protected SetListListIterator(ListIterator it, Set set) {
+    static class SetListListIterator<E> extends 
AbstractListIteratorDecorator<E> {
+
+        protected final Set<E> set;
+        protected E last = null;
+
+        protected SetListListIterator(ListIterator<E> it, Set<E> set) {
             super(it);
             this.set = set;
         }
-        
-        public Object next() {
+
+        public E next() {
             last = super.next();
             return last;
         }
 
-        public Object previous() {
+        public E previous() {
             last = super.previous();
             return last;
         }
@@ -329,16 +350,16 @@ public class SetUniqueList extends 
AbstractSerializableListDecorator {
             last = null;
         }
 
-        public void add(Object object) {
+        public void add(E object) {
             if (set.contains(object) == false) {
                 super.add(object);
                 set.add(object);
             }
         }
-        
-        public void set(Object object) {
+
+        public void set(E object) {
             throw new UnsupportedOperationException("ListIterator does not 
support set");
         }
     }
-    
+
 }

http://git-wip-us.apache.org/repos/asf/commons-collections/blob/884baf0d/src/java/org/apache/commons/collections/list/SynchronizedList.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/commons/collections/list/SynchronizedList.java 
b/src/java/org/apache/commons/collections/list/SynchronizedList.java
index e6f255c..a01e656 100644
--- a/src/java/org/apache/commons/collections/list/SynchronizedList.java
+++ b/src/java/org/apache/commons/collections/list/SynchronizedList.java
@@ -122,7 +122,7 @@ public class SynchronizedList<E> extends 
SynchronizedCollection<E> implements Li
      * 
      * @return an iterator that must be manually synchronized on the collection
      */
-    public ListIterator listIterator() {
+    public ListIterator<E> listIterator() {
         return getList().listIterator();
     }
 
@@ -136,7 +136,7 @@ public class SynchronizedList<E> extends 
SynchronizedCollection<E> implements Li
      * 
      * @return an iterator that must be manually synchronized on the collection
      */
-    public ListIterator listIterator(int index) {
+    public ListIterator<E> listIterator(int index) {
         return getList().listIterator(index);
     }
 

Reply via email to