有没有办法让泛型方法使用其类型参数,就好像它是一个数字?例如,考虑一个方法,该方法接受任何数字并在保持输入类型的同时将其值返回一倍。
static <T> T foo(T number) {
return number*2;
}
由于*
和T
未定义int
,因此无法编译。将T
更改为<T extends Number>
无效,而(T)2
投射也无法编译。
答案 0 :(得分:2)
泛型仅适用于对象。您可以使用Integer
,Double
和类似的类,但不能将副作用用于灵长类动物。
答案 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();