import java.util.*;

public class CatsAndDogs {
  public static void main(String[] args) {
    List cats = new ArrayList();
    for(int i = 0; i < 7; i++)
      cats.add(new Cat(i));
      
    // Not a problem to add a dog to cats:
    //cats.add(new Dog(7));
    for(int i = 0; i < cats.size(); i++)
      ((Cat)cats.get(i)).id();
      // Dog is detected only at run time
      
    //the following one is OK
     //((Dog)cats.get(7)).id();
     
     
     /*
     //iterator
     Iterator e = cats.iterator();
     while(e.hasNext())
     	((Cat)e.next()).id();
     */
     
     /*
     //demonstrate set
     HashSet hs = new HashSet();
     hs.addAll(cats);
     System.out.println(hs);          
     
     LinkedHashSet lhs = new LinkedHashSet();
     lhs.addAll(cats);
     System.out.println(lhs);
     
     //need to implement Comparable for the TreeSet
     TreeSet ts = new TreeSet();
     ts.addAll(cats);
     System.out.println(ts);
     
     */
  }
}


class Cat {
  private int catNumber;
  public Cat(int i) { catNumber = i; }
  public void id() {
    System.out.println("Cat #" + catNumber);
  }
  
  public String toString(){
  	return"Cat #" + catNumber;
  }
}


/*
class Cat implements Comparable{
  private int catNumber;
  public Cat(int i) { catNumber = i; }
  public void id() {
    System.out.println("Cat #" + catNumber);
  }
  
  public String toString(){
  	return"Cat #" + catNumber;
  }
  
  public int compareTo(Object b){
  	int t=((Cat)b).catNumber;
  	return (catNumber>t? 1:(catNumber==t?0:-1));	
  }
}

*/

class Dog {
  private int dogNumber;
  public Dog(int i) { dogNumber = i; }
  public void id() {
    System.out.println("Dog #" + dogNumber);
  }
} 

