7

为什么以下会在 Delphi (XE) 中产生错误?

unit UTest;

interface


type

TTest = class
  public
  procedure Foo<T>(A: T);
end;

implementation

{ TTest }

procedure TTest.Foo<T>(A: T);
begin
  A.Add('hej');
end;

end.

我认为 Delphi 中的泛型类型只是简单地插入到泛型函数中,所以如果与没有 Add(string) 方法的类型一起使用它只会出错。

4

1 回答 1

8

您的代码会产生编译错误,因为编译器无法知道T有一个名为Add接收单个字符串参数的方法。

我认为 Delphi 中的泛型类型只是简单地插入到泛型函数中,所以如果与没有 Add(string) 方法的类型一起使用它只会出错。

如果您使用的是 Smalltalk 或 C++ 模板,那么您的假设将是准确的。但是,泛型与模板不同。对于泛型,您需要对类型参数应用约束。约束需要告诉编译器T必须具有哪些属性。

例如,您可以限制T从具有合适Add方法的类派生。或者您可以限制使用合适的方法T实现接口。Add

Delphi 通用约束的文档链接:http: //docwiki.embarcadero.com/RADStudio/en/Constraints_in_Generics

可以应用的通用约束相当有限,这是一种耻辱。例如,我希望能够将类型限制为具有某些数学运算符。例如,我希望能够将类型限制为拥有+-运算符,例如。然而,泛型和模板各有利弊,所以我承认这些限制是 Delphi 语言设计者合理设计决定的结果。

于 2013-08-26T14:29:20.550 回答