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);
  }
  
}