import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class ForEach { void m1() { Set<? extends CharSequence> s = new HashSet<CharSequence>(); for (CharSequence cs : s) { cs.toString(); } } void m2() { Set<CharSequence> s = new HashSet<CharSequence>(); for (CharSequence cs : s) { cs.toString(); } } <T extends Object> void m3(T p) { Set<T> s = new HashSet<T>(); for (T cs : s) { cs.toString(); } } <T extends Object> void m4(T p) { Set<T> s = new HashSet<T>(); for (Object cs : s) { cs.toString(); } } // An example taken from plume-lib's UtilMDE public static <T extends Object> List<T> removeDuplicates(List<T> l) { // There are shorter solutions that do not maintain order. HashSet<T> hs = new HashSet<T>(l.size()); List<T> result = new ArrayList<T>(); for (T t : l) { if (hs.add(t)) { result.add(t); } } return result; } }