如何使用泛型作为一堆使用不同类型的重载方法的替代?

Tav*_*vel 3 delphi generics delphi-xe7

我有一堆重载方法,所有这些方法都得到一个类型的数组作为参数,并从该数组返回一个随机值:

function GetRandomValueFromArray(Arr: array of String): String; overload;
begin
     Result := Arr[Low(Arr) + Random(High(Arr) + 1)];
end;

function GetRandomValueFromArray(Arr: array of Integer): Integer; overload;
begin
     Result := Arr[Low(Arr) + Random(High(Arr) + 1)];
end;
Run Code Online (Sandbox Code Playgroud)

等等

如何使用泛型为任何类型的数组创建单个方法?像这样的东西(不能在Delphi XE7中编译):

function GetRandomValueFromArray(Arr: TArray<T>): <T>;
Run Code Online (Sandbox Code Playgroud)

感谢任何意见,因为我阅读了大部分有关仿制药的问题,但对我来说仍然不清楚它是否可能?

MBo*_*MBo 8

要使用泛型函数,你必须将它转换为类的方法(奇怪的限制,在我的拙见).请注意,class函数不需要创建实例TDummy

TDummy = class
  class function GetRandomValueFromArray<T>(const Arr: TArray<T>): T;
end;

class function TDummy.GetRandomValueFromArray<T>(const Arr: TArray<T>): T;
begin
  Result := Arr[Low(Arr) + Random(High(Arr) + 1)];
end;

intValue := TDummy.GetRandomValueFromArray<Integer>([1,3,5]);
Run Code Online (Sandbox Code Playgroud)

  • 我想要的 Delphi 功能之一是全局泛型函数,即不需要它们是类的(静态)方法。 (2认同)
  • 从技术上讲,“const arr:T的数组”是正确的签名,因为问题也有开放数组参数而不是动态数组。 (2认同)