diff --git a/src/java/org/apache/commons/collections/list/SetUniqueList.java b/src/java/org/apache/commons/collections/list/SetUniqueList.java index 8ad355383..160693d42 100644 --- a/src/java/org/apache/commons/collections/list/SetUniqueList.java +++ b/src/java/org/apache/commons/collections/list/SetUniqueList.java @@ -283,7 +283,26 @@ public class SetUniqueList extends AbstractSerializableListDecorator { } public List subList(int fromIndex, int toIndex) { - return new SetUniqueList(super.subList(fromIndex, toIndex), set); + List superSubList = super.subList(fromIndex, toIndex); + Set subSet = createSetBasedOnList(set, superSubList); + return new SetUniqueList(superSubList, subSet); + } + + protected Set createSetBasedOnList(Set set, List list) { + Set subSet = null; + if(set.getClass().equals(HashSet.class)) { + subSet = new HashSet(); + } else { + try { + subSet = (Set) set.getClass().newInstance(); + } catch(InstantiationException ie) { + subSet = new HashSet(); + } catch(IllegalAccessException iae) { + subSet = new HashSet(); + } + } + subSet.addAll(list); + return subSet; } //----------------------------------------------------------------------- diff --git a/src/test/org/apache/commons/collections/list/TestSetUniqueList.java b/src/test/org/apache/commons/collections/list/TestSetUniqueList.java index cc82f479b..a4d40a624 100644 --- a/src/test/org/apache/commons/collections/list/TestSetUniqueList.java +++ b/src/test/org/apache/commons/collections/list/TestSetUniqueList.java @@ -22,6 +22,7 @@ import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; +import java.util.Set; import junit.framework.Test; import junit.framework.TestSuite; @@ -470,4 +471,50 @@ public class TestSetUniqueList extends AbstractTestList { assertEquals(4, decoratedList.size()); } + public void testCollections307() { + List list = new ArrayList(); + List uniqueList = SetUniqueList.decorate(list); + + String hello = "Hello"; + String world = "World"; + uniqueList.add(hello); + uniqueList.add(world); + + List subList = list.subList(0, 0); + List subUniqueList = uniqueList.subList(0, 0); + + assertFalse(subList.contains(world)); // passes + assertFalse(subUniqueList.contains(world)); // fails + + List worldList = new ArrayList(); + worldList.add(world); + assertFalse(subList.contains("World")); // passes + assertFalse(subUniqueList.contains("World")); // fails + + // repeat the test with a different class than HashSet; + // which means subclassing SetUniqueList below + list = new ArrayList(); + uniqueList = new SetUniqueList307(list, new java.util.TreeSet()); + + uniqueList.add(hello); + uniqueList.add(world); + + subList = list.subList(0, 0); + subUniqueList = uniqueList.subList(0, 0); + + assertFalse(subList.contains(world)); // passes + assertFalse(subUniqueList.contains(world)); // fails + + worldList = new ArrayList(); + worldList.add(world); + assertFalse(subList.contains("World")); // passes + assertFalse(subUniqueList.contains("World")); // fails + } + + class SetUniqueList307 extends SetUniqueList { + public SetUniqueList307(List list, Set set) { + super(list, set); + } + } + }