
/*
   WideOrNarrow.java
   Burton Rosenberg
   March 18, 1998

*/

class A 
extends Object {
   void f() { ; }   // {} works too. I meant it to be empty!
}

public class WideOrNarrow 
extends Object {
   
   public static void main(String [] argv) 
   {
      Object o ;
      A a;
   
      a = new A() ;
      a.f() ;
      o = a ; // OK, widen A to an Object
//      o.f() ;   // Compiler error, not all Objects have f()

/*
appomattox> javac WideOrNarrow.java
WideOrNarrow.java:24: Method f() not found in class java.lang.Object.
      o.f() ;   // Compiler error, not all Objects have f()
         ^
1 error
appomattox>
*/

      a = (A) o ;  // narrow o to an A. Run time will check.
      a.f() ;   // Now it's OK, compiler knows that a has an f().

      o = new Object() ;
      a = (A) o ;  // now try to narrow o to an A ... but o is not an A.
      // compiles .. but will it run?

/*
appomattox> javac WideOrNarrow.java
appomattox> java WideOrNarrow
java.lang.ClassCastException: java.lang.Object
        at WideOrNarrow.main(WideOrNarrow.java:40)
appomattox>
*/

   }
} 
