Java汎用と集合の汎用VSテンプレート

1079 ワード

Javaの汎用型はC++のテンプレートに似ており,Java汎用型とC++のテンプレートの関係といえば,文法と意味の2つの重要な点を考慮する必要がある.文法は似ているように見えますが、意味は明らかに違います.
文法的には、C++ユーザーにとってよく知られているため、角カッコを選択するのは難しいからです.しかし、文法の上で、彼らの間には少し違いがあります.C++では、次のようにパラメータに余分なスペースが必要です.
  
List< List<String> >


Javaでは、スペースは必要ありません.次のように書くことができます.
List<List<String>>


余分なスペースを使ってもいいですが、これは必要ではありません.(C++では>>間のスペースがない場合は問題が発生しますが、Javaは構文でこの問題を修正します.)
 
意味的にはJava汎用型は消去可能と定義され,C++テンプレートは拡張可能と定義される.C++では、新しいタイプのテンプレートのインスタンスごとに独立してコンパイルされ、整数リストの文字列リストと文字列リストのリストを使用すると、3つのタイプのコードがあります.何百もの異なるタイプのリストを使用すると、何百ものバージョンのコードがあります.よく知られている問題のコードが膨張します.Javaでは、どのようなタイプのリストを使用しても、1つのバージョンのコードしかありません.したがって、コード膨張の問題は発生しません.
拡張性は、intなどの元のタイプの最適化に多くの選択肢を提供するため、消去の実装よりも効率的になる可能性があります.例を挙げると、コードにとって大量のデータを操作し、科学計算の配列では、この違いが効率的になります.しかし、実際には、このような効率の違いは、ほとんどの使用においてそれほど重要ではありません.しかし,これによるコード膨張問題には確かに注意が必要である.
 
C++では、特定のタイプではなく定数の値でテンプレートをインスタンス化することで、マクロ定義として使用することができます.これにより、コンパイル中に複雑な計算が発生する可能性があります.Java汎用型は慎重にタイプを制限しており、簡単で理解しやすいようにしています.