/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
	
	
	interface AverageMaker<T extends Number> {
    T initialResult();
    T add(T a, Number b);
    T divideByCount(T a, int b);
}

public static <T extends Number, R extends Number> R averageValue(Iterable<T> items, AverageMaker<R> maker) {
    R res = maker.initialResult();
    int count = 0;
    for (T val : items) {
        res = maker.add(res, val);
        count++;
    }
    return maker.divideByCount(res, count);
}
	
	static final AverageMaker<Double> doubleAvg = new AverageMaker<Double>() {
    	public Double initialResult() { return 0.0; }
        public Double add(Double a, Number b) { return a + b.doubleValue(); }
        public Double divideByCount(Double a, int b) { return a/b; }
    };
	static final AverageMaker<Integer> intAvg = new AverageMaker<Integer>() {
    	public Integer initialResult() { return 0; }
        public Integer add(Integer a, Number b) { return a + b.intValue(); }
        public Integer divideByCount(Integer a, int b) { return a/b; }
    };
	
	public static void main (String[] args) throws java.lang.Exception
	{
		List<Integer> a = new ArrayList<Integer>();
		a.add(4);
		a.add(8);
		a.add(91);
        a.add(18);
        double avgDouble = averageValue(a, doubleAvg);
        int avgInt = averageValue(a, intAvg);
        System.out.println(avgDouble);
        System.out.println(avgInt);
	}
}