我想在java中泛泛地添加数字。我遇到了困难,因为Numbers类并不真正支持我想要做的事情。到目前为止,我尝试的是:
public class Summer<E extends Number> {
public E sumValue(List<E> objectsToSum) {
E total = (E) new Object();
for (E number : objectsToSum){
total += number;
}
return null;
}
显然这是行不通的。我怎么才能纠正这段代码,这样我就可以得到一个<int>
或<long>
的列表,或者其他任何东西,并返回总和?
发布于 2011-12-29 16:04:47
要计算总和,您需要提供两个操作:
在Java中,这是通过一个接口完成的。下面是一个完整的示例:
import java.util.*;
interface adder<T extends Number> {
T zero(); // Adding zero items
T add(T lhs, T rhs); // Adding two items
}
class CalcSum<T extends Number> {
// This is your method; it takes an adder now
public T sumValue(List<T> list, adder<T> adder) {
T total = adder.zero();
for (T n : list){
total = adder.add(total, n);
}
return total;
}
}
public class sum {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(4);
list.add(8);
CalcSum<Integer> calc = new CalcSum<Integer>();
// This is how you supply an implementation for integers
// through an anonymous implementation of an interface:
Integer total = calc.sumValue(list, new adder<Integer>() {
public Integer add(Integer a, Integer b) {
return a+b;
}
public Integer zero() {
return 0;
}
});
System.out.println(total);
}
}
发布于 2011-12-29 15:42:23
由于Number类不公开用于执行计算的接口,因此解决此问题的唯一方法是创建封装每个支持的数字类型所需操作的类。在你的类中,你需要使用特定的类型。
发布于 2011-12-29 15:44:22
Number有intValue()、floatValue()、doubleValue()、longValue和shortValue()。选择一个并使用它。例如,
double total;
total += number.doubleValue();
return total;
另外,java泛型与c++模板完全不是等同的。您不能分配java泛型类型的新实例。这永远不会起作用:
E hoot = (E) new Object();
最后,long
、short
、int
、double
和float
不是类类型;它们是基本类型。因此,它们不能用于Java泛型。
https://stackoverflow.com/questions/8669838
复制