加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 为什么我不能将TObjectList传递给期望TObjectList的函

发布时间:2020-12-15 04:05:15 所属栏目:大数据 来源:网络整理
导读:我的代码有问题,它使用泛型类型.为什么编译器不知道传递的列表(Result)是TObjectList TItem (TItem是TItems中T的类型)? 接口: type TItem = classend;type IItemsLoader = interface procedure LoadAll(AList : TObjectListTItem);end;type TItemsLoader =
我的代码有问题,它使用泛型类型.为什么编译器不知道传递的列表(Result)是TObjectList< TItem> (TItem是TItems中T的类型)?

接口:

type
   TItem = class
end;

type
  IItemsLoader = interface
    procedure LoadAll(AList : TObjectList<TItem>);
end;

type
  TItemsLoader = class(TInterfacedObject,IItemsLoader)
public
  procedure LoadAll(AList : TObjectList<TItem>);
end;

type
  IItems<T : TItem> = interface
  function LoadAll : TObjectList<T>;
end;

type
  TItems<T : TItem> = class(TInterfacedObject,IItems<T>)
  private
    FItemsLoader : TItemsLoader;
  public
    constructor Create;
    destructor Destroy; override;
    function LoadAll : TObjectList<T>;
end;

执行:

procedure TItemsLoader.LoadAll(AList: TObjectList<TItem>);
begin
  /// some stuff with AList
end;

{ TItems<T> }

constructor TItems<T>.Create;
begin
  FItemsLoader := TItemsLoader.Create;
end;

destructor TItems<T>.Destroy;
begin
  FItemsLoader.Free;
  inherited;
end;

function TItems<T>.LoadAll: TObjectList<T>;
begin
  Result := TObjectList<T>.Create();

  /// Error here
  /// FItemsLoader.LoadAll(Result);
end;

解决方法

在带错误的函数中,Result是TObjectList< T>,其中T是TItem的某个子类,但编译器不知道它是什么特定的类.编译器必须对其进行编译,以便可以安全地运行任何T值.这可能与LoadAll的参数类型不兼容,后者需要TObjectList< TItem>,因此编译器会拒绝代码.

假设T是TItemDescendant,编译器允许编译和执行错误代码.如果LoadAll调用AList.Add(TItem.Create),则AList将最终保留不是TItemDescendant的内容,即使它是TObjectList< TItemDescendant>.它包含一个与其泛型类型参数所表示的类型不同的对象.

仅仅因为S是T的子类型并不意味着X< S>是X T的亚型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读