Рассмотрим следующее объявление универсального служебного класса в Delphi 2010:
TEnumerableUtils = class
public
class function InferenceTest<T>(Param: T): T;
class function Count<T>(Enumerable: TEnumerable<T>): Integer; overload;
class function Count<T>(Enumerable: TEnumerable<T>; Filter: TPredicate<T>): Integer; overload;
end;
Каким-то образом здесь может возникнуть проблема с выводом типа компилятора:
var
I: Integer;
L: TList<Integer>;
begin
TEnumerableUtils.InferenceTest(I); // no problem here
TEnumerableUtils.Count(L); // does not compile: E2250 There is no overloaded version of 'Count' that can be called with these arguments
TEnumerableUtils.Count<Integer>(L); // compiles fine
end;
Первый вызов работает как положено, и T правильно выводится как Integer.
Второй вызов не работает, если только я не добавлю <Integer
> - тогда он работает, как видно из третьего вызова. Я делаю что-то не так или вывод типа в Delphi просто не поддерживает это (я не думаю, что это проблема в Java, поэтому ожидал, что она будет работать и в Delphi).