私はJavaから来た初心者のC++プログラマです。
C++テンプレートとJavaジェネリックは実際には非常によく似ていると感じます。ほとんど同じ状況で同じように使用します。また、同じように「感じます」。しかし、私はシステム間の2つの違いについて考えてみましょう。
Javaではクラス型を型引数としてのみ使用できますが、C++では任意の型が適合します。Java autoboxingは良い。
さらに重要な違い:C++テンプレートはダック型です。つまり、ジェネリック型T
で任意の操作を呼び出すことができます。操作をサポートしていない場合、コンパイル時エラーが発生します。 Javaジェネリックはダック型ではありません。デフォルトでは、すべての型引数はObject
型であり、構文T extends Something
。これにより、T
で定義されたSomething
メソッドを呼び出すことができます。
2番目の点はかなり重要です。しかし、それとは別に、2つのシステムの違いは何ですか?それぞれの長所と短所は何ですか?それらは全体的に似ていますか、それとも異なりますか?
ジェネリックの実装は昼夜を問わず行われます。
Javaで、コンパイルされたコードはジェネリック型へのすべての参照を削除し、必要に応じてキャストを追加します。これは型消去と呼ばれ、List<String> list; ((List)list).add(new Object());
を実行できます。値を文字列として取得しようとします。すべてのJavaジェネリックは、実際には構文シュガーであり、コンパイル時の型チェックが追加されています。
C++では、テンプレートを使用すると、その中のジェネリックパラメーターを使用した型に置き換えた後、コンパイラーはテンプレートコードを再度発行します。これはいくつかの点でより強力ですが、実行可能ファイルが肥大化する可能性があります。