program tgenfunc12; {$mode objfpc} type TTest = class generic function Test<T: class>: T; end; generic function TTest.Test<T>: T; begin Result := T.Create; end; generic function Test<T: IInterface>: T; begin Result := TInterfacedObject.Create; end; var t: TTest; begin t := TTest.Create; t.specialize Test<TObject>.Free; specialize Test<IInterface>; end.