gpt4 book ai didi

java - 是否有一种流行的技术来对具有泛型但限于数字的数组的元素求和?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:59:38 31 4
gpt4 key购买 nike

我创建了一个以数字为界的泛型数组。我创建了一个方法来对它的所有元素求和。
这是代码

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。我也想将返回类型更改为通用类型。

  • 我已经尝试使用通用类型 N 声明 response 变量,但是我无法使用 0 甚至无法初始化它使用 Integer 包装器类'
    N 结果 = Integer.valueOf(0);
    我最初认为这是可能的,因为 Integer 类扩展了 Number 类。
  • 然后我尝试将其初始化为 null
    N 结果 = null;
    然后这一行,
    result = result + array[i].intValue();
    抛出一个错误,说明 Operator + cannot be applied to N, int。我无法将行更改为
    result = result + array[i];
    因为它显示 Operator + cannot be applied to N, N
  • 我也试过这个“hack”
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。- 帮助我了解这个问题的性质和原因,是因为该类仍然是非泛型吗?

最佳答案

如果使用 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));

关于java - 是否有一种流行的技术来对具有泛型但限于数字的数组的元素求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58390115/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com