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