ジェネリックスでのオーバーロードおよび型の互換性
ジェネリックス:インデックス への移動
オーバーロード
汎用メソッドは非汎用メソッドと並行してオーバーロードに対応するのに "overload" 指令を使用します。指定せず、汎用メソッドと非汎用メソッドの間のオーバーロード選択があいまいな場合、コンパイラは非汎用メソッドを選択します。
以下に例を示します。
type
TFoo = class
procedure Proc<T>(A: T); overload;
procedure Proc(A: String); overload;
procedure Test;
end;
procedure TFoo.Test;
begin
Proc('Hello'); // calls Proc(A: String);
Proc<String>('Hello'); // calls Proc<T>(A: T);
end;
型の互換性
インスタンス化されていない 2 つのジェネリックスに代入互換性があると見なされるのは、両者が同一か、共通の型へのエリアスの場合のみです。
インスタンス化された 2 つのジェネリックスに代入互換性があると見なされるのは、基底型が同一(または共通の型へのエイリアス)であり、かつ型引数が同一の場合です。
メモ: Delphi におけるジェネリックスは、C++ におけるテンプレートや C# におけるジェネリック型とは異なります。特に、型パラメータを Integer、Double、String などの特定の単純型に制限することはできません。さまざまな型(単純型を含む)を表現する必要がある場合は、必要な型ごとにオーバーロード関数を使用することを検討するか、System.Rtti ユニットに定義されている TValue などのレコード型を使用します。このユニットには、これらのデータ型の格納とクエリに使用する演算子とメソッドが用意されています。