Java Generics и сложение чисел вместе
Я хотел бы в общем добавить числа в 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>
или что-то еще и вернуть сумму?
5 ответов
чтобы вычислить сумму в общем виде, вам нужно предоставить два действия:
- способ суммировать нулевые элементы
- способ суммировать два элемента
в 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);
}
}
поскольку класс Number не предоставляет интерфейс для выполнения вычислений, единственный способ решить эту проблему-создать классы, которые инкапсулируют необходимые операции для каждого поддерживаемого числового типа. Чем в вашем классе вам нужно будет использовать определенный тип.
Number не поддерживает никаких операций, поэтому вам нужно привести значения к требуемым типам. например, если число является BigDecimal, нет +=
оператора.
число имеет 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 дженерик.
вы должны проверить тип выполнения (например, используя instanceof
) и приведите к известному типу и выполните соответствующую операцию добавления. Не уверен, какой будет тип результата, учитывая, что список может содержать много разных типов чисел.