通常、C++ では次のように使用します。
template<class T>
class MyClass
などと言う必要はありませんextends OtherClass
。
説明は次のとおりです。
C++ と Java の両方で、オブジェクトのメソッドまたはフィールドにアクセスする場合、コンパイラは、オブジェクト式の静的型がそのメソッドまたはフィールドをサポートしていることを確認する必要があります。そうしないと、コンパイルに失敗します。
Java では、ジェネリック クラスとメソッドは一度だけコンパイルされます。ジェネリック クラスまたはメソッドがコンパイルされると、型パラメーター ( などT
) が何であるか、またはその可能性があるかは不明です。したがって、 によって提供されていないメソッドやフィールドにコンパイラがアクセスできるようにするには、境界が必要Object
です。境界を持つ理由は、 のT extends OtherClass
どこかで、によって提供されるMyClass
タイプ の式のメソッドまたはフィールドにアクセスしようとするためです。したがって、この境界により、コンパイラは型チェックを行い、正常にコンパイルできます。T
OtherClass
対照的に、C++ では、テンプレート化されたクラスとメソッドは、コンパイラがテンプレート コードのコピーをコピーして貼り付け、それぞれを実際の型引数に置き換えるかのように、異なる型引数 (テンプレートの各 "インスタンス化" と呼ばれます) ごとに 1 回コンパイルされます。T
コードでの発生。したがって、テンプレート化されたクラスまたはメソッドがコンパイルされると、型T
が何であるかが正確にわかります。T
コンパイラは、指定されたメソッドまたはフィールドをサポートする型を直接チェックできるため、Java のような境界の指定は不要です。T
が のサブタイプである場合OtherClass
、正常にコンパイルされます。T
のサブタイプでない場合OtherClass
、その名前のメソッドまたはフィールドがない可能性があり、あったとしても、適切なタイプがない可能性があるため、コンパイルに失敗する可能性があります。基本的にダックタイピングです。
(可能性は低いですが、 のサブタイプではない別の無関係な型があり、で使用されているOtherClass
ものと同じ名前と型のメソッドとフィールドを持っている可能性があります。その型を使用しても、コンパイラはそれについて文句を言うことはありません. ただし、そのような型が存在するのはおそらく悪い設計であり、誤ってそのような型を間違った場所で使用することはほとんどありません.)OtherClass
MyClass
MyClass