5

私は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の配列ですか?

4

1 に答える 1

9

「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

于 2011-11-16T09:41:09.987 に答える