作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我创建了一个以数字为界的泛型数组。我创建了一个方法来对它的所有元素求和。
这是代码
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
。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/
我是一名优秀的程序员,十分优秀!