我正在尝试以多态方式使用java.lang.Number: 我有一个List,我放置了多个Double,Integer等实例,然后我想对它们进行多态化算术运算(例如每个数字加倍)。
我们没有java.lang.Number的自动装箱功能,而且我没有找到一个更好的方法来做到这一点,而不是 - 不那么多态 - 方法乘法(数字n,int因子)下面的示例源代码......对于这个实现,我们需要一个方法用于每个算术运算(加,减等)。
编辑 - 增强问题:如果我们从抽象的角度思考java.lang.Number,我们会认为任何数字都可以是算术运算的一部分但是它似乎并不存在一种简单的添加方式/减去/乘以/等x到数字列表,与其类型无关(整数,双数,短......)
还有更好的想法吗? 在此先感谢;)
示例源代码:
public class NumberTest {
private List<Number> list = new ArrayList<Number>();
public static void main(String args[]) {
new NumberTest().start();
}
protected void start() {
this.fillList();
Number num;
for (int i = 0; i < list.size(); i++) {
num = this.multiply(list.get(i), 2);
list.set(i, num);
}
System.out.println(this.toString());
}
private void fillList() {
list.add(new Byte((byte) 12));
list.add(new Short((short) 20));
list.add(new Integer(30));
list.add(new Long(40));
list.add(new Float(50.123));
list.add(new Double(60.123));
}
private Number multiply(Number n, int factor) {
if (n instanceof Byte) {
n = n.byteValue() * factor;
} else if (n instanceof Short) {
n = n.shortValue() * factor;
} else if (n instanceof Integer) {
n = n.intValue() * factor;
} else if (n instanceof Long) {
n = n.longValue() * factor;
} else if (n instanceof Float) {
n = n.floatValue() * factor;
} else if (n instanceof Double) {
n = n.doubleValue() * factor;
}
return n;
}
@Override
public String toString() {
String result = "";
for (Number num : list) {
result += num+"\n";
}
return result;
}
答案 0 :(得分:1)
我真的不明白你为什么不能使用Number.doubleValue()来做数学运算。我错过了什么?
e.g。
public Double multiply(Number n, double factor) {
return new Double(n.getDoubleValue() * factor);
}
编辑增加:
@amano澄清说他想要更改现有List中的Objects,而维护其原始类型。我想我的第一个问题是“为什么”?他的例子使用Byte
。将字节乘以大多数时间通常会导致溢出。将double
添加到Integer
将失去精确度。从integer
中减去Byte
并将结果强制转换回Byte
通常会产生错误的结果。将整数除以整数通常会失去精度(例如,3/2 = 1,而不是1.5)。除非你需要绝对完美的精确度(比如说,为了金钱),否则数学上最正确的解决方案是始终转换为double并将结果保持为double。是的,会有一些小的舍入错误,但没有像3/2 = 1或(字节)23 - 665544 =谁知道什么是字节?
为什么你会关心这个价值最初是一个字节?当你想要把它当作一个数字做大事时?数字,数字(技术上,双打)。
所以我理解得更好,但我仍然缺少一些东西。值保持相同原始类型的约束会导致不准确,加上更多的工作。如果你坚持这个约束,是的,你将不得不做很多instanceof
。
答案 1 :(得分:0)
镜像Number类层次结构:编写自己的NumberWrapper类,并为每个原语编写一个专门的类,它知道实际类型并可以执行正确的操作。
深夜编辑:当然,您可以随时使用Number#doubleValue()并仅使用双打进行处理...
答案 2 :(得分:0)
我同意塔索斯的观点,除了写下所有这些听起来很乏味......
您可以尝试使用以下内容:http://code.google.com/p/generic-java-math/,而不是重新发明轮子。我自己从未使用过这个库,但它看起来就像你需要的那样。