Say we got 2 ordered collections of numbers. We want to compute the arithmetic difference element by element.
I think we need to use List of Number in order to model the idea of ‘ordered collection of numbers’.
The problem is that the arithmetic difference (a banal ‘-‘ like in 3-2) is not defined for Number.
I can cast everything to Double, but I’d rather prefer a clean solution.
public static <E extends Number> List<E> listDifferenceElementByElement(List<E> minuend, List<E> subtrahend) throws Exception {
if (minuend.size() != subtrahend.size()) {
throw new Exception("Collections must have the same size"); //TODO: better exception handling
}
List<E> difference = new ArrayList<E>();
int i = 0;
for (E currMinuend : minuend) {
difference.add(currMinuend-subtrahend.get(i)); //error: The operator - is undefined for the argument type(s) E, E
i++;
}
return difference;
}
Any idea?
Since
Numberdoes not provide anysubtractmethod, you can’t do it simply. The alternatives I can think of are:doubleValue()method, and return adouble, but you could lose precision if the lists contain BigDecimal for example.Numbersubclass, but it could create a lot of duplicated code…Option 2 could be implemented like by replacing
difference.add(currMinuend-subtrahend.get(i));bydifference.add(subtract(currMinuend, subtrahend.get(i)));Then it’s only a matter of writing 10
subtractmethods:etc.