--- /dev/null
+/* 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");
+ }
+ }
+}