Я думаю, что "Animal [] [является] супертипом Dog []", вы имеете в виду, что Animal[42]
на самом деле может быть Dog
?Если это так, то ответ будет №
. В Java переменные (включая элементы массива) фактически являются ссылками (например, указателями).
Учитывая
type Animal is tagged null record;
type Dog is new Animal with null record;
выМожно, конечно, сказать
type Plain_Array is array (Positive range <>) of Animal;
, но тогда все элементы должны быть Animals
.
Чтобы получить диспетчеризацию в Аде, вы должны иметь общеклассовое значение для отправки,так что вы можете попробовать
type Class_Array is array (Positive range <>) of Animal'Class;
, но тогда компилятор скажет вам
gnatmake -c -u -f covariant_arrays.ads
gcc -c covariant_arrays.ads
covariant_arrays.ads:8:59: unconstrained element type in array declaration
gnatmake: "covariant_arrays.ads" compilation error
(объекты Animal
и Dog
имеют разный размер).Вы можете попробовать
type Access_Array is array (Positive range <>) of access Animal'Class;
, что позволит вам сказать
AA : Access_Array := (1 => new Animal, 2 => new Dog);
, но тогда у вас останутся проблемы с управлением памятью, потому что Ада не выполняет сборку мусора (по крайней мере, слюбой из известных мне компиляторов кода).Вы можете сэкономить много горя, используя Ada.Containers.Indefinite_Vectors
.