
abstract class Numeric {
    abstract anonymous plus(anonymous value);
    abstract anonymous minus(anonymous value);
}

class GOperator <T extends Numeric> {
    T call_plus_method(T a, T b) {
        return a.plus(b);
    }

    T call_plus_method2(Numeric a, T b) {
        return a.plus(b);
    }
}

class GInteger extends Numeric {
    int value;

    GInteger(int value) {
        self.value = value;
    }

    virtual GInteger plus(GInteger integer) {
        return new GInteger(self.value + integer.value);
    }
    virtual GInteger minus(GInteger integer) {
        return new GInteger(self.value - integer.value);
    }
}

class GFloat extends Numeric {
    float value;

    GFloat(float value) {
        self.value = value;
    }

    virtual GFloat plus(GFloat float) {
        return new GFloat(self.value + float.value);
    }
    virtual GFloat minus(GFloat float) {
        return new GFloat(self.value - float.value);
    }
}
