Ответ 1
Основное преимущество - это менее жесткие правила идентификации типов. Рассмотрим:
a: array of Integer;
b: array of Integer;
Эти две переменные не совместимы с назначением. Ошибка компилятора:
a := b;
С другой стороны, если вы используете общий синтаксис:
a: TArray<Integer>;
b: TArray<Integer>;
то эти две переменные совместимы с назначением.
Конечно, вы можете написать
type
TIntegerArray = array of Integer;
Но все стороны должны соглашаться на один и тот же тип. Это нормально, если весь код находится под вашим контролем, но при использовании кода из разных источников появление родовых динамических массивов имеет огромное значение.
Другим преимуществом, которое возникает в виду, в том же духе, является то, что вы можете легко использовать общий тип массива как возвращаемый тип общего метода.
Без общего массива вы вынуждены объявлять тип этой формы:
TArrayOfT = array of T
в вашем общем классе, что довольно беспорядочно. И если вы пишете общий метод в не-generic-классе, то у вас нет способа сделать это объявление. Опять же общий массив решает проблему.
TMyClass = class
class function Foo<T>: TArray<T>; static;
end;
Все это следует из правил совместимости типов, описанных в документации следующим образом:
Совместимость типов
Два неинтерминированных генерика рассматриваются как присваивание совместимы, только если они идентичны или являются псевдонимами для общий тип.
Рассматриваются два экземпляра, генерируемых в виде экземпляра совместимы, если базовые типы идентичны (или являются псевдонимами для общий тип), и аргументы типа идентичны.