class G16 {

  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> boolean addAll( Collection<T extends E> c );
    
    void clear();
    // etc.
  }

  static <T> void copy( Collection<T> dest, Collection<? extends T> src ){
    dest.clear();
    dest.addAll(src);
  }

  // static <T, S extends T> void copy( Collection<T> dest, Collection<S> src ){


  public static void main( String[] args ){
    Collection<Integer> ci = null;
    Collection<Number>  cn = null;
    Collection<String>  cs = null;

    copy(cn,ci);
    // copy(ci,cn);
    // copy(cn,cs);
  }
  
}