java - Sum of ArrayList for different types -
is possible write single method total
sum of elements of arraylist
, of type <integer>
or <long>
?
i cannot write
public long total(arraylist<integer> list)
and
public long total(arraylist<long> list)
together there error of erasure, , integer
not automatically extends long
, vice versa... code inside identical!
yes, can implement such method, since both integer
, long
extend number
. example can use wildcard type list element type:
public static long total(list<? extends number> list) { long sum = 0; (number n : list) { sum += n.longvalue(); } return sum; }
this works integral types however, since sum
variable , return value of type long
.
ideally able use method float
s , double
s , return object of same type list element type, not easy 2 reasons:
- the thing can
number
value 1 of primitive number types. can not sum 2 of them in number dependent way. - it not possible create 0-object of right class.
edit: much later...
just fun, lets in nice way java. thing have manually provide 2 operations mentioned above. kind of value 2 such operation called monoid in context of algebra , functional programming.
the problem can solved creating objects represent monoid operations:
interface monoidops<t> { t id(); t op(t o1, t o2); }
the total
method can implemented take object of type in addition list:
public static <t> t total(list<t> list, monoidops<t> ops) { t sum = ops.id(); (t e : list) { sum = ops.op(e, sum); } return sum; }
to provide monoidops
implementations numeric classes, lets create simple helper class:
class simplemonoidops<t> implements monoidops<t> { private final t idelem; private final binaryoperator<t> operation; public simplemonoidops(t idelem, binaryoperator<t> operation) { this.idelem = idelem; this.operation = operation; } public t id() { return idelem; } public t op(t o1, t o2) { return operation.apply(o1, o2); } }
the monoidops
implementations can written neatly this:
static final monoidops<integer> int_monoid_ops = new simplemonoidops<>(0, integer::sum); static final monoidops<double> double_monoid_ops = new simplemonoidops<>(0.0, double::sum);
and total
method called this:
int sum = total(arrays.aslist(1, 2, 3), int_monoid_ops);
Comments
Post a Comment