Есть ли массивы в Ada Covariant? - PullRequest
5 голосов
/ 16 ноября 2011

Я знаю, что в Java массивы ковариантны.Так, например:

Assume Dog is a subclass of Animal
In java the arrays are covariant making: Animal[] a supertype of Dog[]
But in java generic collections are not covariant such as: 
ArrayList<Animal> is not a supertype of ArrayList<Dog>

Мой вопрос - это массивы в Ada Covariant?

1 Ответ

9 голосов
/ 16 ноября 2011

Я думаю, что "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.

...