包含TObjectList <T>的TGenericClass <T>无法编译

Ste*_*nas 3 delphi generics delphi-2009

我正在尝试编写一个包含通用TObjectList <T>的泛型类,它应该只包含TItem的元素.

uses
  Generics.Collections;

type
  TItem = class
  end;

  TGenericClass<T: TItem> = class
  public
    SimpleList: TList<T>; // This compiles
    ObjectList: TObjectList<T>; // This doesn't compile: Compiler complaints that "T is not a class type"
  end;
Run Code Online (Sandbox Code Playgroud)

这是一个错误的语法吗?BTW:TGenericClass <T:class>编译,但是List中的Items不再是TItem,这是我不想要的.

Too*_*the 7

通用类型可以有几个约束:

  • 类名,泛型类型必须是该类后代的类.
  • 接口名称,泛型类型必须实现该接口.
  • 'class',泛型类型必须是一个类(这不能与类名组合).
  • 'record',泛型类型必须是记录.
  • 'constructor',有点模糊,但你可以创建泛型类的实例.

如果您创建使用其他泛型的泛型,则需要复制约束,否则它将无效.在您的情况下,TObjectList具有类约束.这意味着,你的T也需要这个约束.

不幸的是,这不能与命名的类约束结合使用.

所以我建议你使用一个接口,这些可以组合使用:

type
  IItem = interface end;
  TItem = class (TInterfacedObject, IItem) end;
  TGenericClass<T: class, IItem> = class
  private
    FSimpleList: TList<T>;
    FObjectList: TObjectList<T>;
  end;
Run Code Online (Sandbox Code Playgroud)

此外,您应该将您的字段设为私有,其他人都可以更改它们.


Mas*_*ler 7

这是D2009编译器的已知错误.它很可能很快就会被修复,无论是在2009年的更新或修补程序中,还是在Delphi 2010(Weaver)发布之后.在那之前,不幸的是,你需要某种解决方法.:(