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) и приведите к известному типу и выполните соответствующую операцию добавления. Не уверен, какой будет тип результата, учитывая, что список может содержать много разных типов чисел.