interface Iterator<E> { E next(); boolean hasNext(); } interface List<E> { void add(E x); Iterator<E> iterator(); } class StupidList<E> implements List<E> { private E e; public void add( E e ){ this.e = e; } public Iterator<E> iterator(){ return new Iterator<E>(){ public E next(){ return e; } public boolean hasNext(){ return true; } }; } } class G6 { public static void main( String[] args ){ List<String> sList = new StupidList<String>(); // subtyping sList.add("Cool stuff"); for( Iterator<String> it = sList.iterator(); it.hasNext(); ){ String s = it.next(); System.out.println(s); } List<Object> oList = sList; // compilation error oList.add(new Object()); for( Iterator<String> it = sList.iterator(); it.hasNext(); ){ String s = it.next(); // String <- Object System.out.println(s); } } }