class TestTernary {

    public static void main(String[] args){      
    
    /** Ternary *************************************************/   
        System.out.println();
        System.out.println("        true ? op2 : op3 \t\t -> " +
              (true  ? "op2" : "op3"));    
        System.out.println("       false ? op2 : op3 \t\t -> " +
              (false ? "op2" : "op3"));            
        System.out.println();

    /** Numeric ref ********************************************/

    byte  bR;
    short sR;
    short s0 = 10;
    int   i0 = 10;
        
    // bR = true ?  b0 : s0;        // found short, required byte       
    // bR = true ?  b0 : i0;        // found int, byte required

    // following compiles and runs OK
    sR = true ? s0 : 1000;
    System.out.println("short = true  ? s0 : 1000 \t\t -> " + sR);
    
    sR = false ? s0 : 1000;
    System.out.println("short = false ? s0 : 1000 \t\t -> " + sR);        
        
        
    /** Object ref **********************************************/

        Class_A a = new Class_A();
        Class_B b = new Class_B();
        Class_C c = new Class_C();
        Class_A a1 = b;
        Class_C c1;

        // compiles ok but NullPointerException if referenced
        // with getClass() or toString()
        // c = true  ? null : new Class_C();
        System.out.println();     
        
//      c1 = false ? a : c;     // compile-error: incompatible type


        System.out.println(" true ? b : a \t\t -> " +
            (true ? b : a) );

        System.out.println("false ? b : a \t\t -> " +
            (false ? b : a) );
                    
    }

}

class Class_A {
    public String toString(){
        return "Class_A";
    }
}
 
class Class_B extends Class_A {
   public String toString(){
        return "Class_B";
    }

}

class Class_C {
   public String toString(){
        return "Class_C";
    }

}
