数字类型的通用方法

时间:2014-11-25 20:41:05

标签: java

有没有办法让泛型方法使用其类型参数,就好像它是一个数字?例如,考虑一个方法,该方法接受任何数字并在保持输入类型的同时将其值返回一倍。

static <T> T foo(T number)  {
    return number*2;
}

由于*T未定义int,因此无法编译。将T更改为<T extends Number>无效,而(T)2投射也无法编译。

3 个答案:

答案 0 :(得分:2)

泛型仅适用于对象。您可以使用IntegerDouble和类似的类,但不能将副作用用于灵长类动物。

答案 1 :(得分:1)

我的回答基于How to add two java.lang.Numbers?

您可以将值转换为已知数字类型并在计算后将其转换回来,但这可能会导致(可重复的)舍入错误。

static <T> T foo(T anyNumber)  {
    BigDecimal result = new BigDecimal(anyNumber.doubleValue()).multiply(new BigDecimal(2));
    if (result instanceof Byte) {
        return (Byte) c.byteValueExtract();
    } else if (result instanceof Double) {
        return (Double) c.doubleValue();
    } else if (result instanceof Float) {
        return (Float) c.floatValue();
    } else if (result instanceof Integer) {
        return (Integer) c.intValue();
    } else if (result instanceof Long) {
        return (Long) c.longValue();
    } else if (result instanceof Short) {
        return (Short) c.shortValueExtract();
    } else if (result instanceof BigDecimal) {
        return result;
    } else {
        throw new NotImplementedException();
    }
}

答案 2 :(得分:0)

无法进行运算符重载,例如:

T number = new T();
number * 5;
在Java中

。我不知道为什么,但你不能。相反,尝试做;

static <T> T foo(T number)  {
    return new T(number.getInt()*2);
}

或其他相似之处。希望能帮助到你。 "+" operator for Java-classes

编辑: 为了扩展有关使用Integer i = 5的注释中提到的内容,这是Java的一个称为autoboxing / unboxing的功能。当你这样做时:

Integer i = 5;
i = i * 4;
int n = i;

Java真的在做:

Integer i = new Integer(5);
i = new Integer(i.intValue() * 4);
int n = i.intValue();