program GenericExamples; {$mode objfpc}{$H+} // generics type generic TArr = array[0..2] of T; generic TProc = procedure(Arg: T); generic TRecG = record F: T; end; TGenericArray = array of T; IGenericInterface = interface function DoSomething(Arg: T): T; end; TGenericClass = class(TInterfacedObject, IGenericInterface) F: T2; type Intf = IGenericInterface; function DoSomething(Arg: T1): T2; function Test(Arg: Intf): Intf; end; const RecLongInt: TRecG = (F:0); var ArraySpecialize: TGenericArray; ClassSpecialize: TGenericClass; function TGenericClass.DoSomething(Arg: T1): T2; begin end; begin FooInt := TGenericClass.Create; end.