Tôi đã bắt đầu sử dụng Generics trong Delphi 2010 nhưng tôi có một vấn đề khi biên dịch đoạn mã này:Tại sao các loại TGeneric <Base> và TGeneric <Descendant> không tương thích?
TThreadBase = class(TThread)
...
end;
TThreadBaseList<T: TThreadBase> = class(TObjectList<T>)
...
end;
TDataProviderThread = class(TThreadBase)
...
end;
TDataCore = class(TInterfacedObject, IDataCore)
private
FProviders: TThreadBaseList<TDataProviderThread>;
...
end;
Sau đó, tôi có một số thủ tục lồng nhau:
procedure MakeAllThreadsActive(aThreads: TThreadBaseList<TThreadBase>);
begin
...
end;
Và cuối cùng tôi muốn gọi thủ tục lồng nhau này trong mã của lớp TDataCore:
MakeAllThreadsActive(FProviders);
Nhưng biên dịch không muốn để biên dịch nó và nó nói (' <>' dấu ngoặc được thay thế bằng '()'):
[DCC Lỗi] LSCore.pas (494): E2010 loại không tương thích: 'TThreadBaseList (TThreadBase)' và 'TThreadBaseList (TDataProviderThread)'
Tôi không hiểu nó mặc dù TDataProviderThread là hậu duệ của TThreadBase.
tôi phải sửa chữa nó bằng cách typecasting cứng:
MakeAllThreadsActive(TThreadBaseList<TThreadBase>(FProviders));
Không ai biết lý do tại sao các trình biên dịch cho biết lỗi này?
Vì những người khác đã giải thích TẠI SAO bạn gặp lỗi này, hãy thử làm cho MakeAllThreadsThực hiện phương thức TThreadBaseList để giải quyết vấn đề. –