В Delphi этот пример будет выглядеть следующим образом (лишенный значения нерелевантный код):
type
TAnimal = class(TObject);
TDog = class(TAnimal);
TPuppy = class(TDog);
TAnimalCarer = class
procedure Display<T: TDog>(dog: T);
end;
var
animal: TAnimal;
dog: TDog;
puppy: TPuppy;
animalCarer: TAnimalCarer;
begin
// animalCarer.Display(animal); // [dcc32 Error] E2010 Incompatible types: 'T' and 'TAnimal'
animalCarer.Display(dog);
animalCarer.Display(puppy);
end.
Невозможно указать нижнюю границу, как показано в статье, на которую вы ссылаетесь, потому что Delphi не поддерживает это.Он также не поддерживает дисперсию типов.
Редактировать: FWIW, в этом случае метод Display даже не должен быть универсальным, а параметр dog может просто иметь тип TDog, поскольку вы можете передать любой подтип.Из-за ограниченных возможностей обобщений в Delphi метод Display не выиграет от того, что он является обобщенным.