3

これが機能しないのはなぜですか?E2511 Type parameter 'T' must be a class type? が表示されます。

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 はTObjectList<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 に答える