/* Types.java
 *
 * An example of a polymorphic method in Java
 *
 *  $ javac Types.java
 *  $ java Types
 *  3 + 4 is 7.
 *  3.20000 + 4.10000 is 7.30000.
 *
 * Jim Mahoney | cs.bennington.college | MIT License | Oct 2021
 */


class IntOrDouble {

    public static final int _INT_ = 1;
    public static final int _DOUBLE_ = 2;
    
    public int type;
    public int intval;
    public double doubleval;
    
    public IntOrDouble(int value){              /* int constructor */
	type = _INT_;
	intval = value;
    }

    public IntOrDouble(double value){          /* float constructor */
	type = _DOUBLE_;
	doubleval = value;
    }

    public IntOrDouble add(int other){                  /* add int  */
	System.out.println(" -- integer add -- ");
	return new IntOrDouble(other + intval);
    }

    public IntOrDouble add(double other){              /* add float */
	System.out.println(" -- double add -- ");	
	return new IntOrDouble(other + doubleval);
    }

    public IntOrDouble add(IntOrDouble other){         /* add IntOrDouble */
	if (type == _INT_){
	    return new IntOrDouble(intval + other.intval);
	}
	if (type == _DOUBLE_){
	    return new IntOrDouble(doubleval + other.doubleval);
	}
	System.out.printf("Oops - unknown IntOrDouble type\n");
	return new IntOrDouble(0);
    }
}

class Types {
    
    public static void main(String[] args){
	IntOrDouble result;
	
	IntOrDouble i = new IntOrDouble(3);
	IntOrDouble j = new IntOrDouble(4);

	IntOrDouble x = new IntOrDouble(3.2);
	IntOrDouble y = new IntOrDouble(4.1);

	result = i.add(j);
	System.out.printf(" %d + %d is %d.\n",
			  i.intval, j.intval, result.intval );

	result = x.add(y);
	System.out.printf(" %g + %g is %g.\n",
			  x.doubleval, y.doubleval, result.doubleval);
    }
    
}