1. ホーム
  2. java

[解決済み] C++とJavaの「汎用」型の違いは何ですか?

2022-04-24 15:53:11

質問

Javaにはジェネリックがあり、C++には非常に強力なプログラミングモデルがあります。 template s. それでは、C++とJavaのジェネリックの違いは何でしょうか?

どのように解決するのか?

両者には大きな違いがあります。C++では、ジェネリック型にクラスやインターフェイスを指定する必要はない。そのため、型付けが緩くなるという注意点はありますが、真にジェネリックな関数やクラスを作ることができます。

template <typename T> T sum(T a, T b) { return a + b; }

上記の方法は、同じ型の2つのオブジェクトを追加するもので、"+"演算子が利用できる任意の型Tに対して使用することができます。

Javaでは、渡されたオブジェクトのメソッドを呼び出す場合、型を指定する必要がある、みたいな。

<T extends Something> T sum(T a, T b) { return a.add ( b ); }

C++では、ジェネリック関数/クラスはヘッダでしか定義できません。なぜなら、コンパイラは(呼び出される)型ごとに異なる関数を生成してしまうからです。そのため、コンパイルが遅くなる。Javaではコンパイルに大きなペナルティはありませんが、Javaはquot;erasure"という技法を使用しており、実行時にジェネリックタイプが消去されるため、実行時にJavaは実際に...を呼び出しています。

Something sum(Something a, Something b) { return a.add ( b ); }

つまり、Javaのジェネリック・プログラミングは実際には役に立たず、新しいforeach構文に役立つちょっとした構文上の糖分でしかないのです。

EDITです。 上の有用性についての意見は、若い自分が書いたものです。Java のジェネリックスは、もちろん型安全性にも役立ちます。