首页 > 解决方案 > 是否有一种流行的技术可以对具有泛型类型但仅限于数字的数组的元素求和?

问题描述

我创建了一个以 Number 为界的泛型数组。我创建了一个方法来总结它的所有元素。
这是代码

class GenericMethod {
    public static void main(String[] args) {
        Integer[] arr = {10, 20, 30, 40, 50};
        int sum = GenericMethod.<Integer>sumOfAllElements(arr);
        System.out.println(sum);
        Float[] floats = {3.0f, 4.19f};
        int sum2 = GenericMethod.<Float>sum(floats);
        System.out.println(sum2);
    }

    public static <T extends Number> int sumOfAllElements(T[] arr) {
        int response = 0;
        for (T t : arr) {
            response += t.intValue();
        }
        return response;
    }
}

在该方法中,返回类型仍然是一个int. 我也想将返回类型更改为泛型。

public static <N extends Number> N sum(N[] array) {
        Number result = array[0];
        if (result instanceof Integer) {
            Integer temp = result.intValue();
            for (int i = 0; i < array.length; i++) {
                temp += array[i].intValue();
            }
            result = temp;
        }
        return (N) result;
    }

但是我必须为所有数字类型指定案例。
有人可以帮助我吗 - 修改此方法,以便它可以返回泛型类型而不是int. - 帮我了解一下这个问题的本质和原因,是不是因为这个类仍然是非泛型类型?

标签: javaarraysgenerics

解决方案


如果使用 Java 8+,最简单的方法是使用Arrays.stream(T[])创建T(s) 的流,然后reduce添加该流。喜欢,

Integer[] arr = { 10, 20, 30, 40, 50 };
Float[] floats = { 3.0f, 4.19f };
System.out.println(Arrays.stream(arr).reduce((a, b) -> a + b));
System.out.println(Arrays.stream(floats).reduce((a, b) -> a + b));

不需要额外的方法。但是,如果你想让它成为一个方法,你可以传递这样的操作

public static <T> T add(T[] arr, BinaryOperator<T> op) {
    return Arrays.stream(arr).reduce(op).get();
}

然后像这样称呼它

System.out.println(add(arr, (a, b) -> a + b));

推荐阅读