Java中的方法重载和泛型参数

6

我有以下两种方法:

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

除了使用类型转换和Object之外,你有没有一种优雅的解决方案,可以避免上述重复代码,并使用单个方法名?

1个回答

13

Java 中的每个数字类型都继承自 Number,因此您可以使用有界类型参数(感谢 Paul)在一个方法中对所有数字类型进行平均:

  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是Guava库的一部分。


2
+1 很好的回答。挑剔一点:这是一个有界的类型参数 - 有界的通配符看起来像 List<? extends Number> numbers(在这种情况下,它会表现相同)。 - Paul Bellora

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接