import java.io.Serializable; class G15 { interface Collection<E> { boolean contains( Object o ); boolean containsAll( Collection<?> c ); boolean removeAll( Collection<?> c ); boolean retainAll( Collection<?> c ); /* <T> boolean containsAll( Collection<T> c ); <T> boolean removeAll( Collection<T> c ); <T> boolean retainAll( Collection<T> c ); */ boolean addAll( Collection<? extends E> c ); // <T extends E> boolean addAll( Collection<T> c ); // etc. } public static void main( String[] args ){ Collection<Integer> ci = null; Collection<Number> cn = null; Collection<String> cs = null; cn.addAll(ci); cn.removeAll(cs); // no common subtypes, no-op // cn.addAll(cs); // ci.addAll(cn); Collection<Serializable> cser = null; // might contain Date objects Collection<Cloneable> cclo = null; // might contain Date objects // cser.addAll(cclo); cser.removeAll(cclo); } }