我已经开始在Delphi 2010中使用泛型,但是在编译这段代码时遇到了问题:TThreadBase = class( TThread )...end;TThreadBaseList<T: TThreadBase> = class( TObjectList<T> )...end;TDataProviderThread = class( TThreadBase )...end;TDataCore = class( TInterfacedObject, IDataCore )private FProviders: TThreadBaseList<TDataProviderThread>;...end;然后我有一些嵌套过程:procedure MakeAllThreadsActive(aThreads: TThreadBaseList<TThreadBase>);begin...end;最后,我想在TDataCore类的代码中调用此嵌套过程:MakeAllThreadsActive(FProviders);但是编译器不想编译它,它说(“ ”括号替换为“()”): [DCC错误] LSCore.pas(494):E2010不兼容的类型: 'TThreadBaseList(TThreadBase)'和 'TThreadBaseList(TDataProviderThread)'尽管TDataProviderThread是TThreadBase的后代,但我不理解。我不得不通过强制类型修复来解决它:MakeAllThreadsActive(TThreadBaseList<TThreadBase>(FProviders));有人知道编译器为什么会说这个错误吗? (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 TDataProviderThread是TThreadBase的后代,但TThreadBaseList<TDataProviderThread>不是TThreadBaseList<TThreadBase>的后代。那不是继承,它叫做协方差,尽管从直觉上看就像是同一件事,但事实并非如此,必须单独加以支持。目前,Delphi不支持它,尽管希望将来会发布。这是协方差问题的基本原因:如果传递给它的函数期望一个TThreadBase对象的列表,并且向它传递一个TDataProviderThread对象的列表,则没有什么可以阻止它调用.Add并将其他一些TThreadBase对象粘贴到其中这个不是TDataProviderThread的列表,现在您遇到了各种各样的丑陋问题。您需要来自编译器的特殊技巧,以确保不会发生这种情况,否则会丢失类型安全性。编辑:这是为您提供的一种可能的解决方案:使MakeAllThreadsActive成为通用方法,如下所示:procedure MakeAllThreadsActive<T: TThreadBase>(aThreads: TThreadBaseList<T>);或者,您可以按照Uwe Raabe的建议进行操作。任一个都会起作用。 (adsbygoogle = window.adsbygoogle || []).push({}); 10-06 10:00