4

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;        
    }

しかし、コンパイルエラーにもかかわらず、いくつかの観察があります。

  1. この関数が極端に巨大な Java ライブラリにないのはなぜですか?

  2. C++ でテンプレートを使用する場合と同様に、ジェネリックを使用することにしました。

  3. 入力データのディープ コピーを取得することが心配です。lhsおよび ``rhs. 誰かがこれについて私を安心させることができますか? C++ では、定数参照を渡すことができます。そして、私は確かに知っています。

  4. outのインスタンス化はT[]、ジェネリック型では正しくないようです。私は何が欠けていますか?

  5. コンパイラは繰り返しを最適化しMath.max(lhs.length, rhs.length)ますか?

  6. コンパイラは好きではありませんlhs[i] + rhs[i]。おそらく、T の型がわからないためですが、C++ では、型がわかるまでテンプレートをコンパイルしようとしないため、これを行うことができます。

  7. 戻るときにアウトのディープ コピーを取得しますか? 繰り返しますが、C++ コンパイラは余分なコピーを取りません。

おそらく私は Java に慣れるには年を取りすぎているのでしょう ;-)

4

2 に答える 2

1

6) コンパイラは lhs[i] + rhs[i] を好みません。おそらく、T の型がわからないためですが、C++ では、型がわかるまでテンプレートをコンパイルしようとしないため、これを行うことができます。

.add(...) 関数を使用していつでもインターフェイスを作成し、T にこのインターフェイスを拡張させることができます。次に、 lhs[i].add(rhs[i]) と書くことができます

于 2013-07-01T11:22:01.347 に答える