/* Test interface dispatch, type checking (instanceof), and casting. */ interface IA { String a(); } interface IB extends IA { String b(); } interface IC extends IB { void c(); int d(); IB e(int i); } interface ID { String z(); String a(); } class CA { String a() { return "CA a()"; } } class CB implements IB { public String a() { return "CB a()"; } public String b() { return "CB b()"; } } class CC extends CB { public int d() { return 99; } } class CD extends CC implements IC { public String a() { return "CD a()"; } public void c() { System.out.println("CD c()"); } public int d() { return 6; } public IB e(int i) { if (i == 1) return new CB(); else return new CD(); } } class CE extends CB implements IB, ID { public String a() { return ("CE a()"); } public String b() { return ("CE b()"); } public String z() { return("CE z()"); } } public class InterfaceDispatch { public static void main(String args[]) { new InterfaceDispatch(); } public InterfaceDispatch() { /* _Jv_InstanceOf */ /* Object instanceof CLASS */ Object obj = new CA(); if (obj instanceof CA) { System.out.println ("ok 1"); } else { System.out.println ("FAIL 1"); } obj = new CD(); if (!(obj instanceof CA)) { System.out.println ("ok 2a"); } else { System.out.println ("FAIL 2a"); } if (obj instanceof CB) { System.out.println ("ok 2b"); } else { System.out.println ("FAIL 2b"); } /* Object instanceof INTERFACE */ obj = new CB(); if (!(obj instanceof IC)) { System.out.println("ok 3"); } else { System.out.println ("FAIL 3"); } if (obj instanceof IB) { System.out.println("ok 4"); } else { System.out.println ("FAIL 4"); } /* InterfaceRef instanceof INTERFACE */ IA ia = new CB(); if (ia instanceof IB) { System.out.println("ok 5"); } else { System.out.println ("FAIL 5"); } if (!(ia instanceof IC)) { System.out.println("ok 6"); } else { System.out.println ("FAIL 6"); } /* InterfaceRef instanceof CLASS */ if (ia instanceof CB) { System.out.println("ok 7"); } else { System.out.println ("FAIL 7"); } if (!(ia instanceof CD)) { System.out.println("ok 8"); } else { System.out.println ("FAIL 8"); } /* _Jv_CheckCast */ Object obj_ca = new CA(); Object obj_cc = new CC(); IA ia2; try { ia2 = (IA) obj_cc; System.out.println("ok 9"); } catch (ClassCastException x) { System.out.println("FAIL 9"); } CD cd; try { cd = (CD) obj_ca; System.out.println("FAIL 10"); } catch (ClassCastException x) { System.out.println("ok 10"); } IA ia3; try { ia3 = (IB) obj_ca; System.out.println("FAIL 11"); } catch (ClassCastException x) { System.out.println("ok 11"); } /* _Jv_LookupInterfaceMethod */ Object obj_cb = new CB(); IB ib = (IB) obj_cb; ib.b(); if (ib.a().equalsIgnoreCase("CB a()")) System.out.println("ok 12"); else System.out.println("FAIL 12"); IC ic = new CD(); if (ic.a().equalsIgnoreCase("CD a()")) System.out.println("ok 13"); else System.out.println("FAIL 13"); if (ic.d() == 6) System.out.println("ok 14"); else System.out.println("FAIL 14"); Object ce = new CE(); ib = (IB) ce; ID id = (ID) ce; if (ib.b().equals("CE b()") && id.a().equals("CE a()")) System.out.println("ok 15"); else System.out.println("FAIL 15"); String t = ((ID)ce).z(); if (t.equalsIgnoreCase("CE z()")) System.out.println("ok 16"); else System.out.println("FAIL 16"); /* Array types */ Object[] obj_a = new CC[10]; try { CB[] ca_a = (CB[]) obj_a; System.out.println("ok 17"); } catch (ClassCastException x) { System.out.println("FAIL 17"); } if (obj_a instanceof IB[]) { System.out.println("ok 18"); } else { System.out.println("FAIL 18"); } IB[] ib_a = new CD[5]; try { CD[] cd_a = (CD[]) ib_a; System.out.println("ok 19"); } catch (ClassCastException x) { System.out.println("FAIL 19"); } CA[] ca_a; try { ca_a = (CA[]) ib_a; System.out.println("FAIL 20"); } catch (ClassCastException x) { System.out.println("ok 20"); } /* Primitive types */ short[] short_a = new short[100]; try { obj = short_a; System.out.println("ok 21"); } catch (ClassCastException x) { System.out.println("FAIL 21"); } try { short[] short_b = (short[]) obj; System.out.println("ok 22"); } catch (ClassCastException x) { System.out.println("FAIL 22"); } int[] short_b; try { short_b = (int[]) obj; System.out.println("FAIL 23"); } catch (ClassCastException x) { System.out.println("ok 23"); } Object obj1 = new int[25]; if (obj1 instanceof short[]) { System.out.println("FAIL 24"); } else { System.out.println("ok 24"); } if (obj1 instanceof int[]) { System.out.println("ok 25"); } else { System.out.println("FAIL 25"); } /* null assignment */ CA obj_ca2 = null; if (obj_ca2 instanceof CA) { System.out.println("FAIL 26"); } else { System.out.println("ok 26"); } } }