【问题标题】:Method Overloading and Arguments with Generics in JavaJava中泛型的方法重载和参数
【发布时间】:2012-09-04 06:56:22
【问题描述】:

我有以下两种方法:

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)来避免上面的重复代码并使用单个方法名称?

【问题讨论】:

    标签: java generics overloading


    【解决方案1】:

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

    【讨论】:

    • +1 不错的答案。 Nitpick:这是一个有界的type parameter - 一个有界的wildcard 看起来像List&lt;? extends Number&gt; numbers(在这种情况下,它的行为相同)。
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多