Esa solución esta muy compleja!
La manera mas simple e idiomática en todos los lenguajes que usan generics es pasar una interface/protocolo (no tengo Delphi a la mano así que...):
Código Delphi
[-]
type
IString = Interface(IInterface)
function IntoString : String;
end;
function split< T: IString > (const S: string; const Separator: array of char): TArray< T >
begin
item.IntoString() end
type TIntoString= reference to function< T >(inputValue: T): String;
function split_f< T > (const S: string; const Separator: array of char, convert: TIntoString< T >): TArray< T >
begin
TIntoString (item) end