将Java代码转换为Delphi时遇到的问题。

3

我有一个必须返回一个通用接口的方法。已经尝试在Delphi中编写该方法,但不确定应该如何编写。有人可以帮助我吗? 以下是我在Java中制作的一个可行示例:

public < T  extends StandardDataProvider<?>> T GetDataProvider(String dataProviderName) {
    if (dataproviders == null)
        buildDataProviderMap();
    if (dataproviders.containsKey(dataProviderName)) {
        return (T) dataproviders.get(dataProviderName);
    } else
        return null;
}

然后尝试在Delphi中执行同样的操作..但无法让它正常工作?

function TLocalDataProviderFactory. GetDataProvider(DataProviderName: string): IStandardDataProvider;  // Shows errors here? 
begin
  if not Assigned(DataProvider) then
    BuildDataProviderMap;
  if DataProvider.ContainsKey(DataProviderName) then
  begin
    Result := DataProvider.Items[DataProviderName];
  end
  else
  begin
    Result:= nil;
  end;
end;

你收到了哪些错误信息? - Avo Muromägi
E2003 未声明的标识符:'T' - Godfather75
IStandardDataProvider是其他接口的基础接口。 IStandardDataProvider <T> = 接口,其子接口为IEventDataProvider = interface (IStandardDataProvider <TUpdateTest>)。 - Godfather75
1个回答

7

Delphi泛型约束不支持通配符。因此,最接近的方法涉及两个泛型参数。函数将如下所示:

function GetDataProvider<S; T: IStandardDataProvider<S>>(...): T;

嗯,不,它可以很好地编译。 - David Heffernan
@MatheusFreitas之前的问题被标记为XE4。 - David Heffernan
@Godfather75,你成功修复了代码中的问题并编译成功了吗? - David Heffernan
不好意思,我还是遇到代码问题了。我已经尝试了你的解决方案,但它就是行不通?如果我不使用泛型,我可以让它工作,但那样我只能访问IStandardDataProvider接口,而不能访问继承自它的其他接口。 - Godfather75
"it does not work mean" 的意思是什么?我的代码编译通过了。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接