2012-09-04 81 views
6

I tienen los siguientes dos métodos:sobrecarga de métodos y argumentos con los genéricos en Java

public static double calculateMeanInt(List<Integer> numbers) { 
    double sum = 0.0; 
    for(Integer number : numbers) 
     sum += number; 
    return sum/numbers.size(); 
} 

public static double calculateMeanDouble(List<Double> numbers) { 
    double sum = 0.0; 
    for(Double number : numbers) 
     sum += number; 
    return sum/numbers.size(); 
} 

¿Usted tiene una solución elegante (con excepción de usar la conversión de tipos y objetos) que permita evitar el código duplicado arriba y va a utilizar una nombre único método?

Respuesta

13

Cada tipo numérico en Java se extiende desde Number, por lo que puede utilizar el parámetro de tipo acotada (gracias Pablo) para promediar todos sus tipos de números en un método:

public static <N extends Number> double calculateMean(List<N> numbers) { 
    double sum = 0.0; 
    for (N number : numbers) 
     sum += number.doubleValue(); 
    return sum/numbers.size(); 
    } 

por ejemplo, así:

double intMean = calculateMean(Lists.newArrayList(1,2,3,4,5)); 
double doubleMean = calculateMean(Lists.newArrayList(1d,2d,3d,4d,5d)); 
double longMean = calculateMean(Lists.newArrayList(1l,2l,3l,4l,5l)); 

Tenga en cuenta que Lists es parte de guayaba.

+2

+1 Nice answer. Nitpick: este es un [* parámetro de tipo * * acotado (http://docs.oracle.com/javase/tutorial/extra/generics/methods.html) - un [comodín] delimitado (http://docs.oracle. com/javase/tutorial/extra/generics/wildcards.html) se vería como 'List numbers' (en este caso se comportaría igual). –

+0

@PaulBellora Tienes razón, se corrigió. Gracias ;) –

Cuestiones relacionadas