java - 是否有一种流行的技术可以对具有泛型类型但仅限于数字的数组的元素求和?
问题描述
我创建了一个以 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
. 我也想将返回类型更改为泛型。
- 我已经尝试
response
用泛型类型声明变量,N
但是我无法使用0
甚至使用Integer
包装类来初始化它
N result = Integer.valueOf(0);
,我最初认为这是可能的,因为Integer
该类扩展了Number
类。 - 然后我尝试将其初始化为,
null
N result = null;
但随后这一行,
result = result + array[i].intValue();
抛出一个错误,说明Operator + cannot be applied to N, int
. 我无法将行更改为,
result = result + array[i];
因为它显示Operator + cannot be applied to N, N
. - 我也试过这个“黑客”
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));
推荐阅读
- postgresql - 从头开始逻辑复制
- elasticsearch - 在 mysql 匹配等多个字段上通过多个通配符在弹性中搜索
- serverless - 使用无服务器组件进行部署时如何定位相同的实例?
- c# - 如何从服务中杀死包含多个后台服务的 Windows 服务
- php - 使用 php SDK 3 在 S3 中标记对象时遇到问题
- python - 在 Python 代码中捕获/捕获错误。InteractiveConsole
- c# - 如何忽略碰撞但在unity2D中引发触发事件
- python - 有没有办法使用 pandas 数据框来分割时间
- r - 将图像位置设置在闪亮仪表板标题的最左侧,并将文本设置在闪亮仪表板标题的中间
- tomcat - 不要在 Kubernetes 的入口级别终止 SSL