Delphi 2010 中返回泛型接口的泛型方法
给出下面的代码,这是实际代码的一个非常精简的版本,我收到以下错误:
[DCC Error] Unit3.pas(31): E2010 不兼容类型:'IXList
在 FindAll 中功能。
我真的不明白为什么,因为之前非常相似的功能没有问题。
谁能解释一下吗?
是我的问题还是编译器的错误?
单元3;
interface
uses Generics.Collections;
type
IXList<T> = interface
end;
TXList<T: class> = class(TList<T>, IXList<T>)
protected
FRefCount: Integer;
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
public
function Find: IXList<T>;
function FindAll<S>: IXList<S>;
end;
implementation
uses Windows;
function TXList<T>.Find: IXList<T>;
begin
Result := TXList<T>.Create;
end;
function TXList<T>.FindAll<S>: IXList<S>;
begin
Result := TXList<S>.Create; // Error here
end;
function TXList<T>.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
Result := E_NoInterface;
end;
function TXList<T>._AddRef: Integer;
begin
InterlockedIncrement(FRefCount);
end;
function TXList<T>._Release: Integer;
begin
InterlockedDecrement(FRefCount);
if FRefCount = 0 then Self.Destroy;
end;
end.
感谢您的回答! 这似乎是一个编译器错误,有一个可接受的解决方法。
通过将接口声明为
IXList<T: class> = interface
function GetEnumerator: TList<T>.TEnumerator;
end;
并实现 findall,
function TXList<T>.FindAll<S>: IXList<S>;
var
lst: TXList<S>;
i: T;
begin
lst := TXList<S>.Create;
for i in Self do
if i.InheritsFrom(S) then lst.Add(S(TObject(i)));
Result := IXList<S>(IUnknown(lst));
end;
我让它在一个简单的示例中工作。
做类似的事情:
var
l: TXList<TAClass>;
i: TASubclassOfTAClass;
begin
.
.
.
for i in l.FindAll<TASubclassOfTAClass> do
begin
// Do something with i
end;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
通过三个小的修改(IInterface、带有“S:类”的 FindAll [感谢 Mason] 以及 FindAll 中的类型转换),我可以编译它。
完整代码:
With three minor modification (IInterface, FindAll with "S: class" [Thanks Mason] and the typecasts in FindAll) I got it compiling.
Full code:
这看起来绝对像是一个编译器错误。他们说他们如何投入大量精力来改进下一个版本 Delphi XE 的泛型问题。当它发布时(应该在接下来的几周内),下载预览版并查看现在是否可以编译。如果没有,请尝试向 QC 提交错误报告。
另外,FindAll
可能应该声明为function FindAll: IXList
;。这并不能解决错误,但是工作的编译器可能会给你一个错误。That definitely looks like a compiler error. They're saying how they've focused a lot of effort into improving Generics issues for the next version, Delphi XE. When it gets released, which should be within the next couple weeks, download the preview and see if that will compile now. If not, try filing a bug report with QC.
Also,
FindAll<S>
should probably be declared asfunction FindAll<S: class>: IXList<S>;
. That doesn't fix the error, but a working compiler would probably give you an error on that.