3

为什么这不起作用?我得到一个 E2511 类型参数“T”必须是类类型?

type
  IBaseProvider<T> = Interface
    function GetAll: TObjectList<T>;
  end;

type
  TCar = class(TInterfacedPersistent, IBaseProvider<TVehicle>)
    function GetAll: TObjectList<TVehicle>;
  end;

implementation

function TCar.GetAll: TObjectList<TVehicle>;
begin
  // do something with Objectlist
  Result := ObjectList
end;
4

1 回答 1

3

参数 T ofTObjectList<T>被约束为一个类。

type
  TObjectList<T: class> = class(TList<T>)
    ....
  end;

您需要在您的类型上声明一个暗示这一点的约束。例如,您可以声明相同的约束:

type
  IBaseProvider<T: class> = Interface
    function GetAll: TObjectList<T>;
  end;

或者你可以声明一个更强的约束,只要TObjectList<T>满足约束。如果您不想限制参数,则需要使用TList<T>.

如果您不熟悉通用约束,文档应填补空白:http ://docwiki.embarcadero.com/RADStudio/en/Constraints_in_Generics

于 2013-11-02T23:14:25.167 回答