我正在编写一个函数来对 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;
}
但尽管有编译错误,但我有几个观察结果。
为什么Java库中没有这个功能,这个功能非常巨大?
我被激励使用泛型,就像您在 C++ 中使用模板一样。
我担心获取输入数据的深层副本;
lhs
和`rhs。任何人都可以让我放心吗?C++ 允许我传递一个常量引用;我肯定会知道的。对于泛型类型,out的实例化
T[]
似乎是非法的。我错过了什么?编译器会优化我重复的
Math.max(lhs.length, rhs.length)
吗?编译器不喜欢
lhs[i] + rhs[i]
. 大概是因为它不知道 T 的类型,但是 C++ 允许您这样做,因为它在知道类型之前不会尝试编译模板。回来的时候会拿出深拷贝吗?同样,C++ 编译器不会额外复制一份。
也许我太老了,无法习惯 Java;-)