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