带有泛型和接口的Delphi错误

带有泛型和接口的Delphi错误,delphi,generics,interface,Delphi,Generics,Interface,下面的Delphi代码编译时没有Foo函数中的错误,而是Foo2函数编译。这让我发疯,有人有主意吗 type IA<T> = Interface end; TA<T> = class(TInterfacedObject, IA<T>) function Foo<V> : IA<V>; end; TB<U,T> = class(TA<T>) end; TC = class

下面的Delphi代码编译时没有Foo函数中的错误,而是Foo2函数编译。这让我发疯,有人有主意吗

type

  IA<T> = Interface
  end;

  TA<T> = class(TInterfacedObject, IA<T>)
    function Foo<V> : IA<V>;
  end;

  TB<U,T> = class(TA<T>)
  end;

  TC = class
    function Foo2<T,V> : IA<V>;
  end;


implementation

{ TA<T> }

function TA<T>.Foo<V>: IA<V>;
begin
  Result := TB<T,V>.Create;
end;

{ TC }

function TC.Foo2<T,V>: IA<V>;
begin
  Result := TB<T,V>.Create;
end;
类型
IA=接口
结束;
TA=等级(TInterfacedObject,IA)
功能Foo:IA;
结束;
TB=等级(TA)
结束;
TC=类
功能Foo2:IA;
结束;
实施
{TA}
函数TA.Foo:IA;
开始
结果:=TB.Create;
结束;
{TC}
函数TC.Foo2:IA;
开始
结果:=TB.Create;
结束;

这看起来很奇怪,我怀疑这是一个bug。您可以通过声明
TB
实现
IA
来解决这个问题。改变

TB<U, T> = class(TA<T>)

这似乎支持了我的信念,即您的代码是正确的,应该被编译器接受。

谢谢您的回答,但是为什么Foo2在不更改声明的情况下工作?正如我所说的,我认为这是一个bug,因为Foo2显式引用了接口。Foo on通过类TA间接引用,因此需要告诉TB is实现了接口。@Dsm我不明白。两个函数返回的类型是相同的,两个函数中的代码也是相同的。@DavidHeffernan我知道,但我在这个网站上看到过类似的问题,这就是原因。我认为这是出于设计,可能是安全第一,如果隐式使用接口(通过继承),那么必须在使用该接口的类中声明该接口。
TB<U, T> = class(TA<T>, IA<T>)
type
  IA = interface
  end;

  TA = class(TInterfacedObject, IA)
    function Foo: IA;
  end;

  TB = class(TA)
  end;

  TC = class
    function Foo2: IA;
  end;

function TA.Foo: IA;
begin
  Result := TB.Create;
end;

function TC.Foo2: IA;
begin
  Result := TB.Create;
end;