我正在编写一个函数来在Java中对两个数组(不一定大小相等)求和并返回结果.
这是我的尝试:
public static <T> T[] sumArrays(T[] lhs, T[] rhs)
{
T[] out = new T[Math.max(lhs.length, rhs.length)];
for (int i = 0; i < Math.max(lhs.length, rhs.length); ++i){
if (i < Math.min(lhs.length, rhs.length)){
out[i] = lhs[i] + rhs[i];
} else if (i < lhs.length){
out[i] = lhs[i];
} else /* if (i < rhs.length)*/{
out[i] = rhs[i];
}
}
return out;
}
Run Code Online (Sandbox Code Playgroud)
但是我有几个观察结果,尽管有编译错误.
为什么这个函数不在Java库中,这在极端情况下是巨大的?
我有动力使用泛型,因为你会在C++中使用模板.
我担心得到输入数据的深层副本; lhs和``rhs.任何人都可以向我保证吗?C++允许我传递一个常量引用; 我肯定知道.
T[]对于泛型类型,out的实例化似乎是非法的.我错过了什么?
编译器会优化我的重复Math.max(lhs.length, rhs.length)吗?
编译器不喜欢lhs[i] + rhs[i].大概是因为它不知道T的类型,但是C++允许你这样做,因为在它知道类型之前它不会尝试编译模板.
返回时是否会拿出一份深刻的副本?同样,C++编译器也不需要额外的副本.
也许我太老了,不习惯Java ;-)
1)为什么这个函数不是在极其庞大的Java库中?
在这里询问意见,偏离主题.
3)我担心得到输入数据的深层副本; lhs和rhs.任何人都可以向我保证吗?C++允许我传递一个常量引用; 我肯定知道.
7)返回时是否会拿出一份深刻的副本?同样,C++编译器也不需要额外的副本.
在Java中不会自动完成深度复制.此外,深度复制通常是一个定义不明确的问题.
4)
T[]对于泛型类型,out的实例化似乎是非法的.我错过了什么?
除了无法实例化泛型类型的数组之外,泛型类型仅涵盖引用类型.你可能只对这里的原始类型感兴趣,所以它们没用.
5)编译器会优化我的重复
Math.max(lhs.length, rhs.length)吗?
有些JIT可能,但你不能有任何保证.提取到局部变量.
6)编译器不喜欢
lhs[i] + rhs[i].大概是因为它不知道它的类型T,但C++允许你这样做,因为它不会尝试编译模板,直到它知道类型.
不幸的是,你在这里遇到了很多麻烦.没有办法将算法生成所有原始Java类型.
| 归档时间: |
|
| 查看次数: |
601 次 |
| 最近记录: |