「Animal[][is] a supertype of 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はガベージコレクションを行わないため(少なくとも、私が知っているネイティブコードコンパイラのいずれかでは)、メモリ管理の問題が残ります。を使用することで、多くの悲しみを救うことができますAda.Containers.Indefinite_Vectors
。