2

Vector をこのようにキャストすると...

var v1:Vector.<String> = new Vector.<String>();
v1.push("foo");

var v2:Vector.<Object> = Vector.<Object>(v1)

v1.push("bar");

trace(v1);   //foo,bar
trace(v2);  //foo

... トレース出力でわかるように、Vector のコピーが作成されます。

しかし、3行目を次のように変更すると...

var v2:Vector.<*> = Vector.<*>(v1)

... コピーは作成されず、v1 と v2 の両方が同じオブジェクトを指し、トレース出力は両方とも「foo,bar」になります。

どうして?どういうわけか一貫した動作があるべきではありませんか?

4

1 に答える 1

1

認識しなければならないのは、それVector.<Something>(Vector.<Anotherthing>)は型キャストではないということです。実際、ある種類のベクトルを別の種類のベクトルにキャストすることはまったくできません! これを試して:

var v1:Vector.<String> = new Vector.<String>();
var v2:Vector.<Object> = v1 as Vector.<Object>; // throws an error

サブタイプのベクトルを割り当てることもできません。

var v1:Vector.<Object> = new Vector.<String>(); // throws an error

これは、String は Object のサブタイプですが、2 種類のベクトルは関連していないためです。

では、なぜあなたの記法は失敗しないのでしょうか? あなたが実際に行っているのは、渡したコレクション型データからベクトルを作成する最上位関数を呼び出しているためです。そのドキュメントには次のように書かれています。Vector()

sourceArray 引数が既にVector.<T>T が基本型であるインスタンスである場合、関数はその Vector を返します。それ以外の場合、結果のベクターには、sourceArray 配列またはベクターの要素が取り込まれます。

型宣言のアスタリスクはプレースホルダーであるため、変数は Vector の型付きインスタンスを保持し、関数が渡したのと同じベクターを返すことができます。

于 2012-05-23T15:05:42.337 に答える