2012-09-04 61 views
6

參數我有以下兩種方法:方法重載與泛型在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(); 
} 

你有一個優雅的解決方案,將禁止上述重複的代碼(不是使用型鑄造和對象等),並使用單一方法名稱?

回答

13

在Java中每個數字型從Number延伸,這樣你就可以使用有限制類型參數(感謝保羅)以平均所有的號碼類型在一個方法:

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(); 
    } 

例如這樣的:

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)); 

注意Lists是番石榴的一部分。

+2

+1不錯的答案。 Nitpick:這是一個有界的[*類型參數*](http://docs.oracle.com/javase/tutorial/extra/generics/methods.html) - 一個有界的[通配符](http://docs.oracle.com。 com/javase/tutorial/extra/generics/wildcards.html)看起來像'List <?擴展數字>數字(在這種情況下,它將表現相同)。 –

+0

@PaulBellora你是對的,更正。謝謝 ;) –