Java で 2 つの配列 (必ずしも同じサイズではない) を合計して結果を返す関数を作成しています。
これが私の試みです:
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 に慣れるには年を取りすぎているのでしょう ;-)