2012-09-04 18 views
6

Tôi đã theo hai phương pháp:Phương pháp quá tải và Arguments với Generics trong 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(); 
} 

Bạn có một giải pháp thanh lịch (trừ sử dụng loại đúc và Object) sẽ tránh mã trùng lặp ở trên và sẽ sử dụng một tên phương thức duy nhất?

Trả lời

13

Mỗi loại số trong Java kéo dài từ Number, vì vậy bạn có thể sử dụng tham số kiểu bị chặn (nhờ Paul) để trung bình tất cả các loại số điện thoại trong một phương pháp:

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

ví dụ như thế:

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

Lưu ý rằng Lists là một phần của ổi.

+2

+1 Câu trả lời hay. Nitpick: đây là một tham số [* type bounded *] (http://docs.oracle.com/javase/tutorial/extra/generics/methods.html) - một [wildcard] bị chặn (http://docs.oracle). com/javase/tutorial/extra/generics/wildcards.html) trông giống như 'List số' (trong trường hợp này nó sẽ hoạt động giống nhau). –

+0

@PaulBellora Bạn đã đúng, đã sửa chữa. Cảm ơn ;) –