【发布时间】:2013-06-28 10:13:14
【问题描述】:
我正在编写一个函数来对 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++ 允许我传递一个常量引用;我肯定会知道的。T[]out 的实例化对于泛型类型似乎是非法的。我错过了什么?编译器会优化掉我重复的
Math.max(lhs.length, rhs.length)吗?编译器不喜欢
lhs[i] + rhs[i]。大概是因为它不知道 T 的类型,但是 C++ 允许您这样做,因为它在知道类型之前不会尝试编译模板。返回时是否要取出深层副本?同样,C++ 编译器不会额外复制一份。
也许我太老了,无法习惯 Java;-)
【问题讨论】:
-
添加两个长度不等的数组的内容实际上并不是一个常见的活动,我从来没有做过。如果是这样,那么如何划分两个数组,减去两个数组,将一个数组中的一个条目提升到另一个数组的幂等等等等。Java 为您提供了在需要时执行此操作的工具
-
T在运行时是未知的,这就是为什么你不能做new T[] -
And + 仅适用于原语(和字符串)而不是所有对象,因此鉴于您已将此函数声明为准备接受编译器不能允许的 anything你用 +
标签: java